如何在外围部件中改善二进制搜索代码的运行时间?

时间:2017-06-01 19:34:38

标签: algorithm performance python-3.x binary-search divide-and-conquer

我正在攻读这门伟大的Coursera课程https://www.coursera.org/learn/algorithmic-toolbox。在第四周,我们有一个与二叉树相关的作业。

enter image description here

我觉得我做得很好。我创建了一个二进制搜索代码,使用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.)

我认为这不是由于我的二进制搜索的实现(我认为是对的)。实际上,我认为这是因为代码的外围部分存在一些不足之处。就像我设法输出最终答案的方式一样。然而,我提出最终答案的方式似乎并不是真的“沉重”......我迷失了。

我没有看到什么?我还没有看到另一个效率低下的问题吗?我怎么解决这个问题?试着以更快的方式呈现最终结果?

0 个答案:

没有答案