Форум: "Основная";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
ВнизОптимизация функции Найти похожие ветки
← →
Хинт © (2005-02-26 13:25) [0]Написал функцию для проверки наличия строки в ListBox"е, который хранит имена файлов. Нужна для того, чтобы пользователь не мог добавить один и тот же файл дважды. В списке указано полное имя файла (C:\Temp\music.mp3). В списке в основном присутствуют более 1000 файлов. И проверка каждой новой строки занимает очень много времени.
Как можно оптимизировать функцию?function TForm1.ExistsInList(Text:string):boolean;
var
i:integer;
begin
Result:=false;
if FListBox.Items.Count=0 then exit;
for i:=0 to FListBox.Items.Count-1 do
begin
if Length(Text)=Length(FListBox.Items[i]) then
if AnsiUpperCase(Text)=AnsiUpperCase(Flistbox.Items[i]) then
begin
Result:=true;
Break;
end;
end;
end;
← →
Anatoly Podgoretsky © (2005-02-26 13:35) [1]IndexOf
← →
XP (2005-02-26 13:42) [2](ListBox.Items.IndexOf(Text) >= 0)
или
(ListBox.Items.IndexOfName(Text) >= 0)
← →
Sam Stone © (2005-02-26 14:13) [3]Pos(Text, ListBox.Items.Text)>0
← →
TUser © (2005-02-26 15:07) [4]шестая строчка - точно лишняя
Оптимизация - сделать список отсортированным и искать бинарно, за логарифмическое время. Если искать надо часто - то за n*log(n) ты его отсортируешь, а поиск будет быстрым. Если только один раз - наверное, надо при заполнении списка сделать какой-нибудь хеш.
← →
Просто Джо © (2005-02-26 15:12) [5]И еще, даже если "в лоб" делать, то запомни, что так делать никогда не нужно:
> if AnsiUpperCase(Text)=AnsiUpperCase(Flistbox.Items[i])
> then
Зачем каждый раз в цикле считать AnsiUpperCase(Text)? Достаточно один раз это сделать перед циклом, результат сохранить, а после сравнивать уже с ним.
← →
Хинт © (2005-02-26 17:56) [6]Всем спасибо. Воспользовался IndexOf.
2Просто Джо
Так тоже делал раньше, но это почти что не влияет на скорость...
← →
Просто Джо © (2005-02-26 18:08) [7]
> но это почти что не влияет на скорость...
А делать все равно не стоит. Глаз режет.
← →
Anatoly Podgoretsky © (2005-02-26 18:08) [8]Sorted и будет сверх-быстро
← →
Просто Джо © (2005-02-26 22:00) [9]
> [8] Anatoly Podgoretsky © (26.02.05 18:08)
> Sorted и будет сверх-быстро
у TStrings нету Sorted
← →
programania © (2005-02-26 22:11) [10]AnsiCompareText должно быть побыстрее
Еще можно сравнивать сначала первый знак строк
это одна команда CPU и если совпало,
то только тогда строки - это
куча команд с вызовом процедур.
← →
Anatoly Podgoretsky © (2005-02-26 23:27) [11]Зато у TListBox есть
TCustomListBox.Sorted
Specifies whether the items in a list box are arranged alphabetically.
← →
reonid © (2005-02-27 01:06) [12]У TStringList тоже есть Sorted.
← →
StarLit (2005-02-27 01:08) [13]>Хинт © (26.02.05 17:56) [6]
>Всем спасибо. Воспользовался IndexOf.
напиши как сделал , тоже надо сейчас делать...
← →
Anatoly Podgoretsky © (2005-02-27 10:46) [14]reonid © (27.02.05 01:06) [12]
Да не важно, раз говорит нет, значит нет.
StarLit (27.02.05 01:08) [13]
А чего там писать одна строчкаif ListBox1.Items.IndexOf("строка") > -1 then ...
← →
Хинт © (2005-02-27 10:57) [15]function TForm1.ExistsInList(Text:string):boolean;
begin
Result:=(FListBox.Items.IndexOf(Text) >= 0);
end;
Всё оказалось намного проще, чем я думал....
А сравнивать, начиная с первого символа нет смысла. Так как в моем случае все строки начинается примерно с "D:\Music\Russian\..."
← →
Хинт © (2005-02-27 10:57) [16]function TForm1.ExistsInList(Text:string):boolean;
begin
Result:=(FListBox.Items.IndexOf(Text) >= 0);
end;
Всё оказалось намного проще, чем я думал....
А сравнивать, начиная с первого символа нет смысла. Так как в моем случае все строки начинается примерно с "D:\Music\Russian\..."
← →
Просто Джо © (2005-02-27 21:10) [17][12] reonid © (27.02.05 01:06)
В листбоксе Items это TStrings, а не TStringList
[14] Anatoly Podgoretsky © (27.02.05 10:46)
Задача поставлена так, что не ясно, можно ли сортировать визуальный список листбокса. Может, это плейлист какой-нибудь, и в нем как-раз строки должны быть не отсортированы, а находится в том порядке, в каком их расположит пользователь.
← →
Anatoly Podgoretsky © (2005-02-27 21:12) [18]Просто Джо © (27.02.05 21:10) [17]
В списке указано полное имя файла (C:\Temp\music.mp3).
← →
Просто Джо © (2005-02-27 21:21) [19]
> [18] Anatoly Podgoretsky © (27.02.05 21:12)
> Просто Джо © (27.02.05 21:10) [17]
> В списке указано полное имя файла (C:\Temp\music.mp3).
Ну, мало ли... Впрочем, похоже, что автор уже "оптимизировал" ([15]). Видимо, это был верх оптимизаторства. Никогда не знаешь, что человеку нужно.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.037 c