2017-02-06 13 views
0

Как я могу представить список, содержащий только двоичные числа (не целое число) на основе списка строк:Представлять и поиск списка двоичного числа в Python

str_list = ['111111', '1111011', '11110011', '11111011', '111100011', '111110011'] 
bin_list = [111111, 1111011, 11110011, 11111011, 111100011, 111110011] 

Начиная с того, что размер строки и бит отличается, значит, поиск в двух списках для того же самого элемента дал разное время? Является ли метод поиска одинаковым для обоих списков?

+1

Метод поиска тот же, метод '__eq__' отличается (и, вероятно, быстрее для целых чисел). –

+0

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

+2

Я согласен с Виллемом. Кроме того, ваш 'bin_list' не содержит двоичных чисел - это просто целые числа base-10, содержащие только цифры 0 и 1. Если вы хотите представить двоичное число, используйте префикс' 0b' –

ответ

1

Метод поиска определен в списке, и единственный способ поиска в неупорядоченном списке - , итерирующий (конечно, порядок, в котором итерация произвольная, но нет причин использовать другую для другой тип данных, тем более, что вы можете поместить объекты с разными типами в один и тот же список).

Так что список в основном не знают, какие элементы в нем, и перебирает список, как:

# basic implementation of linear search 
def __contains__(self, item): 
    for elem in self: 
     if item == elem: 
      return True 
    return False 

Теперь единственное, что отличает это == метод (и, таким образом, лежащий в основе __eq__). В самом деле: равенство int может быть рассчитано более эффективно, так как обычно 32 или 64 бита можно сравнить сразу (так как обычно это работает на процессоре). Это в отличие от строк, где один выполняет итерации над символами. Таким образом, проверки равенства над int s быстрее, чем те, что над str.

Наконец, вы можете кодировать двоичные числа, более компактные по целому числу. Например, 1110 (двоичный) эквивалентен 14. Вам не нужно делать математику самостоятельно: как this answer говорит, вы можете просто написать 0b1110, а Python преобразует его в int 14.

+0

На самом деле, меня интересует сложность и время поиска, в котором я упоминал str_list и bin_list, я думаю, что они не совпадают с 0b010! = '010' (в представлении размера) – Boubakr

+0

Ну, как сказано перед '0b010 'является ** целым числом ** (' int' или 'long' и т. д.). И здесь мы можем делать сравнения 64 бит (или 32 бит за раз). Если целые числа ограничены (не всегда случай), то сравнение выполняется в постоянное время. В противном случае они являются * O (n) * с * n * длиной строки/числа. Но так как целые числа могут сравнивать большое количество бит за раз, есть огромное ускорение по сравнению со строками в любом случае. –

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

  • Нет связанных вопросов^_^