2017-02-17 4 views
1
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 использует последовательный поиск, где это бинарный поиск.

+1

его 'item' и вы добавляете к' 'деталей. Опечатка. – zengr

+0

класс SequentialStringList(): Защиту __init __ (само): self.items = [] Защиту strAdd (самостоятельно, пункт): self.items.append (пункт) Защиту FindItem (самостоятельно, пункт): для строки в self.items: если строка == пункт: возврата строки возврата 'None' защиту iadd(): ALIST = SequentialStringList() для й в диапазоне (20): ALIST .strAdd ("тест" + ул (x)) печать (alist.findItem ("тест19")) работает нормально. –

+0

Side-note: Если это для класса, то что бы то ни было, но если вы пытаетесь сделать это для реального кода, я должен отметить, что [модуль 'bisect'] (https://docs.python.org/ 3/library/bisect.html) является правильным правилом для двоичного поиска в Python. – ShadowRanger

ответ

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):

+0

Итак, вы видели, что я пытаюсь сделать. Я пошел на рекурсивный подход из-за того, что вам нужно было выполнить задание. Хотя я могу взглянуть на другие подходы к эталону. Если у вас есть ссылка, которую я мог бы прочитать по индексу low/high, это было бы здорово. –

+0

Что-то вроде этого http://stackoverflow.com/a/41452949/231917 – zengr

+0

Будут ли они по-прежнему иметь отношение к обработке строк и int? для цели тестирования im, просто делая цикл for, чтобы добавить int в строку «test» и добавить их в массив. –

0

Ваш код не работает, потому что вы ошибочно написали __init__. Вам нужно два подчеркивания с каждой стороны, или это просто странно названный метод. Так как вам не хватает __init__, используется __init__ (который не устанавливает атрибуты), и у вас нет атрибута или items. Вы должны исправить __init__ и использовать последовательное имя items:

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

У вас есть много других проблем здесь (вы не поддерживаете порядок сортировки, поэтому бинарный поиск не будет работать, вы не реализовали __getitem__ так что self[midpoint] не будет работать, поэтому вам понадобится self.items[midpoint], недостаток __len__ означает, что len(self) не будет работать и т. Д.), Но эти два вопроса выше, что специально заставляет вас получить AttributeError.

+0

Спасибо, что вы не заметили недостающее подчеркивание. Я уверен, что у меня много проблем, и мне просто нужно было пройти мимо этого первого, чтобы продвигаться вперед. –

Смежные вопросы