ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |

02.02.2010, 23:29
|
|
Участник форума
Регистрация: 09.05.2009
Сообщений: 186
Провел на форуме: 1682814
Репутация:
102
|
|
бинарный поиск
собстно решил проапгрейдить поиск в своём удоляторе до бинарного. всё бы нечего, но результаты простого перебора и бинарного поиска заметно отличаются - в объёмных базах бинарный не находит примерно 10% совпадений. wtf?!
вот кусок бинарного:
Код:
//f4, f5 - стринглисты
f5.sort;
f4.sort;
while I<=f4.Count-1 do
begin
verh:=0;
niz:=f5.count;
found:=FALSE;
repeat
sred:=trunc((niz-verh)/2)+verh;
if AnsiPos(f4.Strings[I],f5.strings[sred])<>0
then found:=TRUE
else
if f4.Strings[I < f5.strings[sred]
then niz:=sred-1
else verh:=sred+1;
until (verh > niz) or found or (verh = f5.count);
if found
then
begin
form1.Memo6.Lines.Add(f5.Strings[sred]);
I:=I+1;
end
else
I:=I+1;
end
естественно, все стринглисты сортирую перед поиском.
вчомпроблема? или это такая фича бинарного поиска? 
|
|
|

03.02.2010, 08:24
|
|
Постоянный
Регистрация: 25.07.2008
Сообщений: 454
Провел на форуме: 1229135
Репутация:
425
|
|
Сообщение от 1n0y
собстно решил проапгрейдить поиск в своём удоляторе до бинарного. всё бы нечего, но результаты простого перебора и бинарного поиска заметно отличаются - в объёмных базах бинарный не находит примерно 10% совпадений. wtf?!
вот кусок бинарного:
Код:
//f4, f5 - стринглисты
f5.sort;
f4.sort;
while I<=f4.Count-1 do
begin
verh:=0;
niz:=f5.count;
found:=FALSE;
repeat
sred:=trunc((niz-verh)/2)+verh;
if AnsiPos(f4.Strings[I],f5.strings[sred])<>0
then found:=TRUE
else
if f4.Strings[I < f5.strings[sred]
then niz:=sred-1
else verh:=sred+1;
until (verh > niz) or found or (verh = f5.count);
if found
then
begin
form1.Memo6.Lines.Add(f5.Strings[sred]);
I:=I+1;
end
else
I:=I+1;
end
естественно, все стринглисты сортирую перед поиском.
вчомпроблема? или это такая фича бинарного поиска? 
мб все из-за AnsiPos?
|
|
|

03.02.2010, 08:42
|
|
Участник форума
Регистрация: 09.05.2009
Сообщений: 186
Провел на форуме: 1682814
Репутация:
102
|
|
нублин, юзая простой перебор всё ведь чудесно работает с AnsiPos..
|
|
|

03.02.2010, 09:09
|
|
Постоянный
Регистрация: 25.07.2008
Сообщений: 454
Провел на форуме: 1229135
Репутация:
425
|
|
попробуй pos();
|
|
|

03.02.2010, 12:18
|
|
Участник форума
Регистрация: 09.05.2009
Сообщений: 186
Провел на форуме: 1682814
Репутация:
102
|
|
неа, не помогло..
|
|
|

03.02.2010, 12:24
|
|
Статус пользователя:
Регистрация: 26.07.2005
Сообщений: 568
Провел на форуме: 1290766
Репутация:
1236
|
|
это все потуму что строки терминируются ключевым символом, в дос (не помню какая инт) это был $, строковые функции си - 0, а в паскале понятия не имею. для поиска двоичных данных функции поиска подстрок вообще невозможно использовать.
сложного ниче нет. берешь массив паттерна и массив данных, и едешь по массиву сравнивая первый символ паттерна с текущим указателем, если не совпадет - следующий, если совпал - сверяешь второй и тд
__________________
 
snow white world wide
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|