2017-04-07 02:19:02 +00:00
|
|
|
'''
|
|
|
|
Author : Mehdi ALAOUI
|
|
|
|
|
|
|
|
This is a pure Python implementation of Dynamic Programming solution to the longest increasing subsequence of a given sequence.
|
|
|
|
|
|
|
|
The problem is :
|
|
|
|
Given an ARRAY, to find the longest and increasing sub ARRAY in that given ARRAY and return it.
|
|
|
|
Example: [10, 22, 9, 33, 21, 50, 41, 60, 80] as input will return [10, 22, 33, 41, 60, 80] as output
|
|
|
|
'''
|
|
|
|
def longestSub(ARRAY): #This function is recursive
|
2019-08-19 13:37:49 +00:00
|
|
|
|
2017-04-07 02:19:02 +00:00
|
|
|
ARRAY_LENGTH = len(ARRAY)
|
|
|
|
if(ARRAY_LENGTH <= 1): #If the array contains only one element, we return it (it's the stop condition of recursion)
|
|
|
|
return ARRAY
|
|
|
|
#Else
|
|
|
|
PIVOT=ARRAY[0]
|
2017-04-10 12:49:01 +00:00
|
|
|
isFound=False
|
|
|
|
i=1
|
|
|
|
LONGEST_SUB=[]
|
|
|
|
while(not isFound and i<ARRAY_LENGTH):
|
|
|
|
if (ARRAY[i] < PIVOT):
|
|
|
|
isFound=True
|
|
|
|
TEMPORARY_ARRAY = [ element for element in ARRAY[i:] if element >= ARRAY[i] ]
|
|
|
|
TEMPORARY_ARRAY = longestSub(TEMPORARY_ARRAY)
|
|
|
|
if ( len(TEMPORARY_ARRAY) > len(LONGEST_SUB) ):
|
2017-04-07 02:19:02 +00:00
|
|
|
LONGEST_SUB = TEMPORARY_ARRAY
|
2017-04-10 12:49:01 +00:00
|
|
|
else:
|
|
|
|
i+=1
|
2017-04-07 02:19:02 +00:00
|
|
|
|
2017-04-10 12:49:01 +00:00
|
|
|
TEMPORARY_ARRAY = [ element for element in ARRAY[1:] if element >= PIVOT ]
|
|
|
|
TEMPORARY_ARRAY = [PIVOT] + longestSub(TEMPORARY_ARRAY)
|
|
|
|
if ( len(TEMPORARY_ARRAY) > len(LONGEST_SUB) ):
|
2017-04-07 02:19:02 +00:00
|
|
|
return TEMPORARY_ARRAY
|
2017-04-10 12:49:01 +00:00
|
|
|
else:
|
2017-04-07 02:19:02 +00:00
|
|
|
return LONGEST_SUB
|
|
|
|
|
|
|
|
#Some examples
|
|
|
|
|
|
|
|
print(longestSub([4,8,7,5,1,12,2,3,9]))
|
|
|
|
print(longestSub([9,8,7,6,5,7]))
|