LINUX.ORG.RU

Можно ли найти количество отличающихся символов в двух строках, не перебирая все символы?

 , , ,


0

1

Есть две строки (или два массива) одинаковой длины. Они состоят из ограниченного набора символов. Можно ли найти КОЛИЧЕСТВО отличающихся символов/элементов, не сравнивая их всех попарно?

★☆

Упорядочить? Как минимум, если символ меньше минимального - сравнивать больше не нужно

mrn
()
Ответ на: комментарий от mrn

А если номер элемента важен, тогда только попарное сравнение

mrn
()

Задачка O(N) однозначно. Я уверен - можно извернуться и ускорится x2/4/8 (но не больше) особенно если строки aligned (бежать по 4-8 байт, вычитать как int/long, и считать число ненулевых байтов в результате). Здесь есть специалисты которые могут подсказать конкретику, @slovazap в частности - что касается x86 asm я с ним тягаться даже пытаться не буду ;)

bugfixer ★★★★★
()
Ответ на: комментарий от den73

Нет. Мне самому в голову взбрело.

hateWin ★☆
() автор топика

Ксорнуть две эти строки, потом посчитать количество «0x00». Это если задача о том, чтобы узнать, какое количество символов на тех же позициях в первой и во второй строке совпадают

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 2)
Ответ на: комментарий от hateWin

Ну вообще-то XOR и последующее сравнение результатов с нулём есть попарное сравнение, я бы не принял такое решение. Была подобная задача с собеседований, где нужно было какую-то контрольную сумму, но точно не помню, и XOR там тоже фигурировал.

den73 ★★★★★
()
Последнее исправление: den73 (всего исправлений: 1)

ты не написал главное - язык. на скриптовых языках типа js/python того же левенштейна не имеет смысла реализовывать, потому как потребление ресурсов на порядки вырастает. на больших текстах может вешать комп

tz4678 ★★
()
Ответ на: комментарий от tz4678

это, кстати, главный аргумент в пользу бесполезности изучения примитивных алгоритмов на скриптовых языках (реализовывать никогда не придется). в питоне много либ, которые нативно реализуют, например, AES-шифрование и у таких либ как правило slow в названии

tz4678 ★★
()
Последнее исправление: tz4678 (всего исправлений: 1)

что же касается твоей задачи, то можно:

➜ ipython                   
Python 3.10.2 (main, Jan 15 2022, 19:56:27) [GCC 11.1.0]
Type 'copyright', 'credits' or 'license' for more information
IPython 8.0.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from collections import Counter

In [2]: c1 = Counter("cat")

In [3]: c2 = Counter("rat")

In [4]: c1 - c2
Out[4]: Counter({'c': 1})

In [5]: 

Там создаются два ассоциативных массива, где ключ это символ, а значение сколько раз он встречается в тексте.

tz4678 ★★
()

Нужно преобразовать массивы в множества и найти их разность. В таком случае если в одном массиве есть несколько похожих символов, они соединятся в один и фактически попарного сравнения уже не будет.

mydibyje ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.