二进制搜索和列表

时间:2017-02-17 00:49:21

标签: python python-3.x

class BinaryStringList():
    def __init_(self):
        self.item = []

    def strAdd(self,item):
        self.items.append(item)

    def finditem(self, item):

        if len(self)==0:
            print("List is empty!")
        else:
            midpoint = len(self)//2
            if self[midpoint]==item:
                print("Item Found ", item)
            else:
                if item<self[midpoint]:
                    return finditem(self[:midpoint], item)
                else:
                    return finditem(self[midpoint+1:], item)

所以我发现我遇到的问题是在尝试将项目添加到列表中时。如果我这样做:

alist = BinaryStringList()
alist.strAdd("test1")

我的代码失败,说明对象没有属性。不知道为什么它失败了,因为我有几乎完全相同的代码用于另一个程序,除了find使用顺序搜索,因为这是一个二进制搜索。

2 个答案:

答案 0 :(得分:0)

您的代码失败了,因为您拼错了__init__。每侧需要两个下划线,或者它只是一个奇怪的命名方法。由于您缺少__init__,因此使用默认__init__(不设置属性),并且您没有itemitems属性。您需要修复__init__,并为items使用一致的名称:

class BinaryStringList():
    def __init__(self):  # <-- Added extra trailing underscore
        self.items = []  # Fixed name to be items, not item 

你在这里遇到很多其他问题(你没有维护排序顺序,所以二进制搜索无法正常工作,你还没有实现__getitem__所以self[midpoint]赢了&# 39;工作所以你需要self.items[midpoint],缺少__len__意味着len(self)也不会工作,等等,但是上面的两个问题是具体的让你得到AttributeError

答案 1 :(得分:0)

您的代码中存在多个语法错误。此外递归不起作用,您需要具有返回的基本条件。这个解决方案可行,但我强烈建议您使用递归来解决更简单的问题,以了解它是如何工作的。

class BinaryStringList:
    def __init__(self): # You had 1 _ after init
        self.items = [] # Typo, should have been items.

    def strAdd(self,item):
        self.items.append(item)

    def finditem(self, item):
        return self.binser(self.items, item)

    def binser(self, items, item):
        if len(items)==0:
            return

        midpoint = len(items)/2 # len(self) means nothing, it should be len(self.items)
        if items[midpoint]==item:
            return item
        else:
            if item<items[midpoint]:
                return self.binser(items[:midpoint], item) #self[:midpoint] means nothing, you needed self.items[:midpoint]
            else:
                return self.binser(items[midpoint+1:], item)

binser = BinaryStringList()
binser.strAdd(1) # You added a string here. Your logic won't work with string.
binser.strAdd(2)
binser.strAdd(3)
binser.strAdd(5)
binser.strAdd(8)
binser.strAdd(9)
binser.strAdd(10)

print binser.finditem(1)
print binser.finditem(10)
print binser.finditem(5)
print binser.finditem(11)

(还有其他解决二进制搜索的方法 - 即迭代方法,传递低/高索引值而不是拼接输入数组)。尝试使用这两种方法解决二进制搜索。

通过传递低/高索引值的二进制搜索,您的binser签名将如下所示:def binser(self, low, high, item):