三元搜索就像二进制搜索一样,但将项目除以3

时间:2013-03-12 02:26:01

标签: python python-3.x binary-search ternary-search

下面有一个名为“test”的函数。我的程序无法通过测试功能。

这是我的三元搜索代码。三元搜索就像二元搜索,但不是将所有元素除以2,而是将它们除以3。

要使用三元搜索,我使用了index2作为1/3项的分隔符。 index1是2/3项的分隔符。

您只需将“高”和“低”分配给index1或index2。这使您可以将列表分为三个部分。高和低用于查找应搜索的分割列表的哪个部分。然后,该过程不断重复,直到高和低的值彼此接近。

seq是列表中的项目,即。 [1,2,3,4,5 ...] 列表中的项目是有序的。

键是我正在寻找的值

并且ternary_search返回键的索引或键的索引关闭键

玩得开心! 干杯!

def ternary_search(seq,key):
    length = len(seq)
    left = 0
    right = length
    index = 0
    x = True
    while x and left <= right:
        #focal = (high + low) //3

        if left == right:
            #check similarity between values and key
            return index
        else:
            if right - left > 0:
                index1 = ((right+2*(left))//3)
                index2 = ((2*(right)+left)//3)
                if left == right:
                    x = False
                    return (index1+index2)
                if seq[index1] == key:
                    x = False
                    return index1
                if seq[index2]== key:
                    x = False
                    return index2
                if key<seq[index1]:
                        right = index1 - 1
                else:
                    if key > seq[index1] and key <seq[index2]:
                        right = index2 - 1
                        left = index1 - 1
                    if key > seq[index2]:
                        left = index2+1

    return index

def test():
    seq = []
    for i in range(1,1001):
        seq.append(i)
    for j in range(1,1001):
        is_pass = (ternary_search(seq,j)==j-1)
        assert is_pass == True, "fail the test when key is %d"%j
    if is_pass == True:
        print("=========== Congratulations! Your have finished exercise 2! ============")
if __name__ == '__main__':
    test()

2 个答案:

答案 0 :(得分:0)

您的错误就在行中:

if left == right:
#check similarity between values and key
return index 

基本上现在当你的上下值(右和左)相遇时,它们将返回存储在变量索引中的值,但是在函数体中你永远不会改变索引的值,所以它总是会返回0。让你的代码工作的方法就是一旦你知道左==右检查并查看值是否= = =如果是,那么返回左或右,因为两者必须是该值的索引。我用你的代码做了这个,它通过了测试功能。顺便说一下,实验室8好运。

答案 1 :(得分:0)

def ternary_search(seq,key):
  length = len(seq)
  left = 0
  right = length
  index = 0
  x = True
  while x and left <= right:
    #focal = (high + low) //3
    if left == right:
        #check similarity between values and key
        return left 

    elif right - left > 0:
        index1 = ((right+2*(left))//3)
        index2 = ((2*(right)+left)//3)
        if seq[index1] == key:
            return index1
        elif seq[index2] == key:
            return index2
        else:
            if key<seq[index1]:
                    right = index1 - 1
            elif key > seq[index1] and key <seq[index2]:
                    right = index2 - 1
                    left = index1 - 1
            elif key > seq[index2]:
                    left = index2+1

return index

顺便说一下实验室8的好运。