Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.06.17;
Скачать: [xml.tar.bz2];

Вниз

Господа, подскажите пожалуйста самый быстрый   Найти похожие ветки 

 
Smok_er   (2002-05-31 09:27) [0]

способ обнаружения записи в StringList. Т.е. при добавлении очень большого числа строк и использовании метода IndexOf для определения, есть ли уже запись или нет, процесс начинается очень быстро, но по мере увеличения числа записей очень сильно замедляется.
Причем сначала я делал по-другому - сначала закидывал все в один стринглист, сортировал, а потом постепенно идя от последнего к первому элементу, с этого стринг лист закидывал в другой.
И еще один вопрос - если к стринглисту применить сортировку, то новые записи будут добавляться с учетом сортировки или в конец?


 
MBo   (2002-05-31 09:31) [1]

если поставить sorted:=true, то новые строки встанут на место


 
Vitaly   (2002-05-31 09:45) [2]

Надо же было сбацать такой хитрый алгоритм
и не проверить, а как же добавляются
новые строки при sorted := true.


 
Smok_er   (2002-05-31 09:46) [3]

А скорость нахождения какой-то записи при этом будет быстрее?
Т.е. вопрос такой:
допустим, в стринглисте 2000 записей.
нам надо проверить 100000 записей, есть ли какие-то из них в стринг листе.
интересно, этот код будет работать быстрее, если стринглист StringList1 будет отсортирован?
if StringList1.IndexOf(a)=-1 then
StringList1.Add(a);


 
Smok_er   (2002-05-31 09:49) [4]

2 Vitaly
дело в том, что я сортировал в самом конце. Относительно свойства sorted не знал, но интересен вопрос в моем предыдущем постинге. Мы просто одновременно написали.


 
MBo   (2002-05-31 09:51) [5]

несравнимо быстрее- будет двоичный поиск


 
Smok_er   (2002-05-31 09:55) [6]

А можно пример реализации?


 
MBo   (2002-05-31 09:59) [7]

Предыдущее 31.05.02 09:51 следует читать:
при sorted:=true IndexOf сам использует двоичный поиск


 
handra   (2002-05-31 10:16) [8]

//Быстро, но требует памяти при большом количесве слов
unit wrd_tree;

interface

type

TWordTreeNode=class(TObject)
public
Links: Array[byte] of Pointer;
Id: Integer;
constructor Create;
destructor Destroy; override;
end;

TWordTree = class(TObject)
private
FRoot: TWordTreeNode;
public
constructor Create;
destructor Destroy; override;

function FindWord(wrd: string): Integer;
procedure AddWord(wrd: string; id: Integer);
end;

implementation

constructor TWordTreeNode.Create;
begin
FillChar(Links,sizeof(Links),0);
Id := 0;
end;

destructor TWordTreeNode.Destroy;
var i: Integer;
begin
for i:=Low(Links) to High(Links) do
if Links[i]<>nil then begin
TWordTreeNode(Links[i]).Destroy;
Links[i] := nil;
end;
Id := 0;
inherited;
end;

constructor TWordTree.Create;
begin
FRoot := TWordTreeNode.Create;
end;

destructor TWordTree.Destroy;
begin
FRoot.Free;
inherited;
end;

function TWordTree.FindWord(wrd: string): Integer;
var i: Integer;
node: TWordTreeNode;
begin
Result := 0;
node := FRoot;
for i:=1 to Length(wrd) do begin
node := node.Links[ord(wrd[i])];
if node=nil then Exit;
end;
Result := node.Id;
end;

procedure TWordTree.AddWord(wrd: string; id: Integer);
var i: Integer;
b: byte;
node: TWordTreeNode;
begin
node := FRoot;
for i:=1 to Length(wrd) do begin
b := ord(wrd[i]);
if node.Links[b]=nil then
node.Links[b] := TWordTreeNode.Create;
node := node.Links[b];
end;
node.Id := id;
end;

end.



 
handra   (2002-05-31 10:19) [9]

Конечно, можно хранит в параметрах Data у элементов TStringList значение 32-битной хэш-функции и искать по этому значению...


 
Romkin   (2002-05-31 10:36) [10]

Да посмотрите же исходники - если TStringList.Sorted
то IndexOf... применяет быстрый поиск
Установи Duplicates := dupIgnore; Sorted := true;
И просто закидывай все строки - получится отсортированный список уникальных строк, причем очень быстро, быстрее написать сложно


 
Smok_er   (2002-05-31 10:38) [11]

2 handra
Спасибо за вариант, но к сожалению, именно из-за "дефицита" памяти и огромного числа строк (может быть порядка 100.000) я и ищу более быстрый и ресурсосберегающий метод.

Кстати, при sorted:=True увеличение быстродействия ну очень сильно ощутимо. Возросло где-то раз в 50-100.
Интересно, а как к примеру сортировать, если
1) нужна сортировка в обратном порядке;
2) сортировать числовые значения.

И еще один вопрос. Если использовать схему Name=Value, то если где-то в строке Name встречается знак "=" - происходит каша. Может есть способы, как от этого избавиться...?


 
erik   (2002-05-31 15:50) [12]

А чем неустраивает DBGrid для вывода, а хранить строки можно в TClientDataSet. Это будет на порядок быстрее, если есть желание то можно использовать отсортированый масив. Выводить можно спомощю сверх быстрого "TArrayGrid - визуальный компонент для табличного представления данных" http://home.earthlink.net/~akonshin/delphi_ru.htm


 
Smok_er   (2002-06-05 23:49) [13]

Спасибо за ответ! Долго не заходил в интернет по некоторым причинам.
Честно говоря, не очень хочется связываться с базами данных
Да они и не нужны в принципе, зато увеличат размер программы как минимум в 2 раза.



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

Форум: "Основная";
Текущий архив: 2002.06.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.215 c
3-55045
3asys
2002-05-23 14:54
2002.06.17
Как программно вызвать диалог создания строки подключения?


14-55292
evgeg
2002-05-10 19:27
2002.06.17
---|Ветка была без названия|---


1-55051
MAN-IN-RED
2002-06-03 20:06
2002.06.17
Есть парочка вопросов к мастерам:


3-55028
Esipenko
2002-05-23 11:58
2002.06.17
Шифрование таблиц


1-55157
limon
2002-06-04 11:08
2002.06.17
Кредитные карточки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский