我正在攻读这门伟大的Coursera课程https://www.coursera.org/learn/algorithmic-toolbox。在第四周,我们有一个与二叉树相关的作业。
我觉得我做得很好。我创建了一个二进制搜索代码,使用Python3中的递归解决了这个问题。那是我的代码:
#python3
data_in_sequence = list(map(int,(input().split())))
data_in_keys = list(map(int,(input()).split()))
original_array = data_in_sequence[1:]
data_in_sequence = data_in_sequence[1:]
data_in_keys = data_in_keys[1:]
def binary_search(data_in_sequence,target):
answer = 0
sub_array = data_in_sequence
#print("sub_array",sub_array)
if not sub_array:
# print("sub_array",sub_array)
answer = -1
return answer
#print("target",target)
mid_point_index = (len(sub_array)//2)
#print("mid_point", sub_array[mid_point_index])
beg_point_index = 0
#print("beg_point_index",beg_point_index)
end_point_index = len(sub_array)-1
#print("end_point_index",end_point_index)
if sub_array[mid_point_index]==target:
#print ("final midpoint, ", sub_array[mid_point_index])
#print ("original_array",original_array)
#print("sub_array[mid_point_index]",sub_array[mid_point_index])
#print ("answer",answer)
answer = original_array.index(sub_array[mid_point_index])
return answer
elif target>sub_array[mid_point_index]:
#print("target num higher than current midpoint")
beg_point_index = mid_point_index+1
sub_array=sub_array[beg_point_index:]
end_point_index = len(sub_array)-1
#print("sub_array",sub_array)
return binary_search(sub_array,target)
elif target<sub_array[mid_point_index]:
#print("target num smaller than current midpoint")
sub_array = sub_array[:mid_point_index]
return binary_search(sub_array,target)
else:
return None
def bin_search_over_seq(data_in_sequence,data_in_keys):
final_output = ""
for key in data_in_keys:
final_output = final_output + " " + str(binary_search(data_in_sequence,key))
return final_output
print (bin_search_over_seq(data_in_sequence,data_in_keys))
我通常会得到正确的输出。例如,如果我输入:
5 1 5 8 12 13
5 8 1 23 1 11
我得到序列的正确索引或(-1)如果术语不是顺序(第一行):
2 0 -1 0 -1
但是,我的代码没有传递预期的运行时间。
Failed case #4/22: time limit exceeded (Time used: 13.47/10.00, memory used: 36696064/536870912.)
我认为这不是由于我的二进制搜索的实现(我认为是对的)。实际上,我认为这是因为代码的外围部分存在一些不足之处。就像我设法输出最终答案的方式一样。然而,我提出最终答案的方式似乎并不是真的“沉重”......我迷失了。
我没有看到什么?我还没有看到另一个效率低下的问题吗?我怎么解决这个问题?试着以更快的方式呈现最终结果?