[Delphi] szybkie wczytywanie du?żych plików. słownik

0

No i pojawił się u mnie problem: ( z góry proszę wszystkich, którym proponowałem frytki :P itp..., o to, by nie komentowali, bo będę niemiły :P)

Mój problem: Robię przy okazji nowego projektu słownik jęz.niem. ( baza na razie skromna - 5000 słów). Jak szybko wczytać te baze do Listboxa (standardowe listbox.items.Loadfromfile(); jest nieco zawolne przy tej wielkości bazie - 5000 lini)

Jak szybko wyszukiwać w tym listboxie ( chcę zrobic coś a'la HelpEngine z tej strony, ale tamto skacze i po całej bazie, kiedy coś wpisuję, i tak szuka, aż wpisze całe słowo. Chcę żeby chodziło taj jak w helpie, i żeby chodziło szybko. Pliz Help

--
Spin
Delphi - Lets make Windows better....

0

a może zrobić to na tablicach....?

--
Polacy nie piją - oni degustują,
Rosjanie nie chleją - oni ucztują...
A co u Was... ;)

0

Procedure TForm1.ZALADUJ;
CONST
slow = 'C:niemiecki.TXT';
VAR
Plik : TextFile;
tmp : shortstring;
BEGIN
AssignFile(Plik, slow);
Reset(Plik);
List.Clear;
List.Items.BeginUpdate;
WHILE NOT Eof(Plik) DO
BEGIN;
Readln(Plik, tmp);
List.Items.Add(tmp);
END;
List.Items.EndUpdate;
END;

FUNCTION TForm1.SZUKAJ(tekst: shortstring): Integer;
VAR
I, J : Integer;
tmp : shortstring;
BEGIN;
Result := -1;
FOR I := 1 TO List.Items.Count - 1 DO
FOR J := 1 TO Length(List.Items.Strings[I]) DO
BEGIN;
tmp := List.Items.Strings[I];
IF tmp[J] = tekst[I] THEN
BEGIN;
RESULT := I;
EXIT;
END;
END;
END;

0

słownik na listBox chyba sam nie wiesz na co sie porywasz , wiesz ile pamieci zajmie np przy 100000 słów, przeszukanie tak zorganizowanego słownika to udreka w najgorszym razie 100000 porownań zakładając ze nie zaindeksujesz listbxa .

Poszukaj w ksiazkach do algorytmiki działu USS - uniwersalna struktura słownikowa

np książka
ALGORYTMY Struktury Danych i techniki Programowanie
autor Piotr Wróblewski

tam jest nawet gotowy słownik

np dla słów
alf,alfabet,alfabetycznie,anagram,anonim,astronomia,ankara
słownik zajmuje 36 bajtów gdzie wszystkie słowa zajmują 53 bajty
oczywiscie pomijam zanaki końca ciągu tekstowego
efekt jest oczywisty na 7 słowach masz 67% zmniejszenie objętości słownika

pozdrawiam wojtas

0

A robisz ListBox1.Items.BeginUpdate przed czytaniem i EndUpdate po? To przyspiesza, bo program nie wypisuje kazdego itema w czasie dodawania go do listboxa, tylko dopiero po endupdate.

--
Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

0

Polecam gościa który jest dobry z niemca i pewnie będzie chciał pomoc ale nie wiem (ale OT co ? :) )
gg: 2837108

--

0

Poszukaj w ksiazkach do algorytmiki działu USS - uniwersalna struktura słownikowa

Bardzo fajna rzecz. A wygląda to mniej więcej tak:

type
PNode = ^TNode;
TNode = record
EndOfWord: Boolean;
Next: array['a'..'z'] of PNode;
end;

I dla słów alfabet i algebra wygląda to tak:

a - l + f - a - b - e - t
+ g - e - b - r - a

Litera "a" oznacza początek słowa i zawiera wskaźniki do liter od 'a' do 'z'. Wszystkei są nil, prócz 'l', który wskazuje na kolejny element. W tym elemencie ('l') znajdują się 2 wskaźniki różne od nil - do 'f' i do 'g'. I tak dalej. EndOfWord świadczy, że dana litera kończy słowo.

--
Vogel [[email protected]]

Life is just a dream, you know...
[Cowboy Bebop]

1 użytkowników online, w tym zalogowanych: 0, gości: 1