Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.038 c
4-1106937007
Лёха
2005-01-28 21:30
2005.03.13
Функция wsprintf...


14-1108879176
begin...end
2005-02-20 08:59
2005.03.13
С Днём рождения! 20 февраля


1-1109580784
yk
2005-02-28 11:53
2005.03.13
какой компанент можно использовать для просмотра html?


3-1108099425
Карелин Артем
2005-02-11 08:23
2005.03.13
Как удалить все индексы в базе Firebird?


3-1107976969
Diaskhan
2005-02-09 22:22
2005.03.13
базы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский