Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.19;
Скачать: CL | DM;

Вниз

быстрый поиск в некотором массиве   Найти похожие ветки 

 
Hamlet   (2002-12-06 15:41) [0]

Как максимально быстро организовать поиск среди динамически изменяемого набора данных?
Подробнее: Есть некоторая таблица с бо-ольшим количеством записей. Есть некоторый набор данных, в котором элементы этой таблицы добавляются/удаляются во время работы программы. Периодически необходимо для каждого элемента таблицы определять, находится ли он в этом наборе или нет. Структуру таблицы менять нельзя.
Сейчас реализовано через TStringList c перебором всех значений, но работает крайне медленно. Как можно сделать по-другому?


 
Виктор Щербаков ©   (2002-12-06 15:45) [1]

Ты бы код привел. А то не совсем понятно о чем речь.


 
Anatoly Podgoretsky ©   (2002-12-06 15:50) [2]

Да и поточнее, про массивы, про TStringList или про базы речь


 
han_malign ©   (2002-12-06 15:52) [3]

строить свой индекс, конкретно - завести булевский вектор по размеру таблицы и проставлять в нем флаг присутствия в наборе для каждого елемента


 
Hamlet   (2002-12-06 15:55) [4]

в общих чертах:
Table1 - таблица с данными (не-SQL)
SList:TStringList - в нем лежит выборка

for i:=0 to Table1.recordCount-1 do
begin
for z:=0 to SList.Count-1 do
begin
if sList[z]=Table1.Fields[1].Value then OK:=true;
end;
if OK then
begin
........
end
end

т.е., если элемент таблицы есть в выборке, то для него выполняется действие, если нет - то нет.


 
Hamlet   (2002-12-06 15:59) [5]

2 han_malign: а будет ли это быстрее списка?


 
MBo ©   (2002-12-06 16:02) [6]

SList сортирован?


 
Hamlet   (2002-12-06 16:04) [7]

нет, но, имхо, сортировка почти не ускорит процесс, т.к. в выборке в среднем 3-5 элементов, а в таблице до 10.000, так что основное время занимает фильтрация ненужных записей. Зато будет тратиться время на сортировку при каждом удалении/добавлении элемента, что происходит довольно часто.


 
han_malign ©   (2002-12-06 16:15) [8]

... Как думаешь что быстрее - перебор значений списка, или модификация/проверка элемента булевского массива по абсолютному индексу?
З.Ы. Естественно нужно отслеживать изменения таблицы(добавление,удаление,перемещение элементов), и соответственно изменять индекс. В принципе, есть древний, как информатика, финт ушами - при присоединении элемента к набору, в строковое поле добавляется специальный символ, соответственно при отсоединении - удаляется(скажем #0 в конец - безболезнено при отображении(если не TMemo - оно будет | рисовать)) (С)Удаление записей в DBase таблице. Короче нужно найти в полях хотя-бы один битик значение которого не влияет на работу всего остального, ну или где надо маски(фильтры) проставить.


 
mrcat ©   (2002-12-06 16:24) [9]

begin
if sList[z]=Table1.Fields[1].Value then begin
OK:=true;
break; end;
end;


 
Hamlet   (2002-12-06 16:24) [10]

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


 
Hamlet   (2002-12-06 16:26) [11]

2 mrcat: пробовал и так, ничуть не убыстряется. См. ответ выше


 
TTCustomDelphiMaster ©   (2002-12-06 16:30) [12]

Поиск в отсортированном массиве намного быстрее.


 
Hamlet   (2002-12-06 16:34) [13]

дело не в поиске. Внимательно см. условие задачи.


 
Hamlet   (2002-12-06 16:37) [14]

мне нужно конкретное решение - как наиболее быстро будет работать. С указанием конкретных типов, а еще лучше - с примером кода. Я и сам понимаю, что отсортированный массив может и будет быстрее, но как грамотно его организовать, чтобы действительно было быстрее?
К тому же он будет быстрее только в том случае, когда элемент таблицы есть в выборке. А их в основном в выборке нет. Т.е. фактически мне нужно ускорить как раз отсечение ненужных элементов, а не поиск нужных.


 
Sha ©   (2002-12-06 19:25) [15]

1. Поиск в сортированном StringListе достаточно быстрый.
2. Если надо быстрее, заведи дополнительный сортированный
целочисленный массив и храни в нем CRC32 строк.
По нему и отсекай. И только если CRC32 совпала ищи в
StringListе. Проверено - все летает.


 
Fantasist ©   (2002-12-07 05:28) [16]

Ха, так как я понял, основное время тратиться на перебор таблицы. Имеет значение из чего состоит выборка - если из элементов этой таблицы (Table1), то лучше просто составить список из номеров выбранных элементов и синхронизировать этот список при изменении таблицы. Тогда надо будет всего лишь пройтись по этим трем-пяти элементам и ничего проверять не надо. Если же это какие-то левые значения, то это сложнее. Перебирать таблицу из 10000 элементов все-равно долго. Тут надо думать о логике программы, потому как схема с перебором всех элементов явно не классна.


 
murzikN   (2002-12-07 07:44) [17]

Используй TSortList.
Скачать можно по адресу
http://www.ivanovtver.chat.ru/sortlist.zip



Страницы: 1 вся ветка

Текущий архив: 2002.12.19;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.017 c
7-61837
nickolayLI
2002-10-16 14:00
2002.12.19
блокировка/и разблокировка мыши


1-61624
Hamlet
2002-12-06 15:41
2002.12.19
быстрый поиск в некотором массиве


14-61812
koks
2002-11-28 11:52
2002.12.19
Сети:


3-61429
Ramil
2002-11-27 16:01
2002.12.19
Автоинкрементные поля в IBase...


14-61816
VictorT
2002-11-26 20:32
2002.12.19
О жребиях