2016-09-22 3 views
0

Я хочу свести к минимуму стоимость сравнения двух списков, содержащих несколько слов. В приведенном ниже коде A имеет 4 слова, тогда как B имеет 2 слова и стоит O(n^2), что очень плохо. Хотя за 100 слов это может занять много времени. Могу ли я как-то свести к минимуму?Снизить стоимость сравнения двух списков

A= ["helry", "john" , "kat" , "david"] 
d="Helry David" 
B = d.lower().split() 

for x in range(len(A)): 
      for i in range(len(B)): 
       if A[x] == B[i]: 
        print("Match = " + A[x]) 
       else: 
        print("No") 
+2

Поскольку вы хотите напечатать что-либо для каждой возможной комбинации, конечно, невозможно бить «O (n^2)». –

+0

@StefanPochmann Можем ли мы это сделать, изменив структуру данных? Например: Храните данные в некоторых других DS, кроме массивов. – Amar

+1

@Amar No. Есть N^2 пары элементов, поэтому вы будете печатать N^2 вещи. –

ответ

0
  1. Сортировка массива для O (NlogN) в первую очередь.
  2. Сравните это в O (n), потому что вы можете смело предположить, что связь между определенными элементами одинакова после сортировки.
+0

Насколько эффективны ваши предложения? – Amar

+0

@Amar, если можно дать уникальную характеристику для каждого слова, вы можете использовать сортировку ковша. Если это так, возможна сложность O (len (A) + len (B)). –

+0

Кстати, создание набора означает, что вы используете встроенную хеш-функцию для строк. –

0
  1. O(nlogn) для сортировки A.
  2. используйте двоичный поиск для каждого элемент B в A Iit'll возьмите O(log n). Для m элементов в B, это будет O(m*logn).

(или), если вы используете хэш, вы можете сделать в O(m) для m элементов B.

+0

Приведите пример. Если сможешь. – Amar

1

Используйте наборы вместо списков (кстати, они не называются массивами в Python). То, что вам нужно, - это пересечение двух множеств, которое (в среднем) O(min(len(A), len(B)) (https://wiki.python.org/moin/TimeComplexity). И поскольку этот алгоритм встроен и реализован в C, он намного быстрее, чем все, что вы могли бы написать в коде Python.

Пример (A и B считаются определены как раньше):

>>> set(A) & set(B) 
{'david', 'helry'} 

Это дает вам набор всех значений, которые содержатся в А и В.

+0

Можете ли вы привести пример? – Amar

+0

Посмотрите на вопрос, что говорит Стефан Похман. «Поскольку вы хотите напечатать что-то для каждой возможной комбинации, конечно ** невозможно ** бить« O (n^2) »« – Amar

+0

Это решение не равно «O (min (len (A), len (B)) ', но' O (max (len (A), len (B)) '(и' O (len (A) + len (B))). Вы ссылались на пересечение, но я думаю кто-то может ошибочно принять его за сложность решения, так как это единственная сложность, о которой вы говорите. –

0

Вы можете сделать это в о (п) времени с наборами и тестированием для членства с in, вам все равно придется перебрать все имена в A но проверке, если каждое имя в setof зовут O(1):

A = ["helry", "john" , "kat" , "david"] 
d = "Helry David" 
st = set(d.lower().split()) 

for name in A: 
    if name in st: 
     print("Match = {}".format(name)) 
    else: 
     print("No match") 
+0

Ваш код не работает. с 'd = Helry не является Дэвидом ». Программа дает разные результаты. – Amar

+0

@Amar, была опечатка, это также предполагает, что вы просто хотите найти матчи, которые делают смысл для меня, поскольку вы никогда не используете элемент из 'd.lower(). split()' поэтому зачем вам нужно перебирать каждый элемент? –

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