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

Вниз

Ускорить поиск строки в массиве строк.   Найти похожие ветки 

 
Регулятор   (2012-06-09 11:11) [0]

Есть обычный TList заполненный таким:


type
 TItem = record
    Data: Pointer;
    Name: string;
 end;



В Data какая-нибудь именнованая структура, класс или еще что.

Вопрос как быстро найти нужный элемент по ключу максимально быстро?
Сейчас это простой цикл со сравнением в лоб.

Слышал про некие хэши и черно-красные деревья.
Но я самоучка. Такие штуки не понимаю.

Объясните, пожалуйста.


 
Ega23 ©   (2012-06-09 11:17) [1]

Сортируй по строкам при добавлении. И поиск дихотомией.


 
Palladin ©   (2012-06-09 11:26) [2]

https://www.google.ru/search?client=opera&rls=ru&q=TDictionary&sourceid=opera&ie=utf-8&oe=utf-8&channel=suggest


 
TUser ©   (2012-06-09 11:35) [3]


> Слышал про некие хэши и черно-красные деревья.
> Но я самоучка. Такие штуки не понимаю.

Нет препятствий самоучкам! Можно посмотреть, например, в книге

Ахо, Хопкрофт, Ульман. Структуры данных и алгоритмы.


 
Дмитрий С ©   (2012-06-09 12:05) [4]

Или посмотреть реализацию метода TStringList.Find и Sort. Я всегда так делаю =))


 
MBo ©   (2012-06-09 14:18) [5]

1. Модифицируется ли список, или заполняется один раз?
2. Какова средняя длина строк-ключей?


 
Регулятор   (2012-06-09 16:15) [6]


> Ega23 ©   (09.06.12 11:17) [1]
>
> Сортируй по строкам при добавлении.


По алфавиту или как?


> MBo ©   (09.06.12 14:18) [5]
>
> 1. Модифицируется ли список, или заполняется один раз?
> 2. Какова средняя длина строк-ключей?


1. Заполняется по надобности.
   Т.е. может сейчас добавим 10 записей, потом еще сколько-то.
  Обычно записи не удаляются.
  Если удаляются, то все зараз.

2. Обычно не больше 15 символов.


 
Ega23 ©   (2012-06-09 18:01) [7]


> По алфавиту или как?


Ну уж сам критерий подбирай, я тебе тут не советчик


 
TUser ©   (2012-06-09 18:08) [8]


> 10 записей

При таких размерах оптимизация не нужна.


 
Kerk ©   (2012-06-09 18:15) [9]


> TUser ©   (09.06.12 18:08) [8]
>
> > 10 записей
>
> При таких размерах оптимизация не нужна.

Это не нанотехнологично (с)
:)


 
Регулятор   (2012-06-09 18:49) [10]


> TUser ©   (09.06.12 18:08) [8]
>
>
> > 10 записей
>
> При таких размерах оптимизация не нужна.
>


100


 
Rouse_ ©   (2012-06-09 19:00) [11]


> TUser ©   (09.06.12 18:08) [8]
>
> > 10 записей
>
> При таких размерах оптимизация не нужна.

О да, всунуть 10 записей в сортированный блоб из пару лярдов элементов, нафиг оптимизировать? :)

ЗЫ: по сабжу, наиболее оптимально будет использовать сортированный двунаправленный список.
Т.е. грубо работаем со структурой:

TItem = record
   Data: Pointer;
   Name: string;
   PreviosItemIndex, NextItemIndex: Integer;
end;
TItems = array of TItem;

Поиск дихотомией, объединение одинарным проходом двумя курсорами.


 
sniknik ©   (2012-06-09 19:18) [12]

> Есть обычный TList заполненный таким:
> type
>  TItem = record
>     Data: Pointer;
>     Name: string;
>  end;


пусть станет обычным TStringList без record, заполненным объектами, строкой с указателем...
там есть сортировка, и быстрый поиск.


 
MBo ©   (2012-06-09 19:21) [13]

Раз набор данных модифицируется, то статическую структуру данных использовать нехорошо, и подойдет любая реализация словаря (Dictionary, Map) - сбалансированные деревья (RB, AVL), хэш-таблицы, trie. Например - THashedStringList из inifiles


 
TUser ©   (2012-06-09 23:27) [14]


> Регулятор   (09.06.12 18:49) [10]
>
> > TUser ©   (09.06.12 18:08) [8]
> >
> >
> > > 10 записей
> >
> > При таких размерах оптимизация не нужна.
> >
>
>
> 100
>
>

При таких размерах оптимизация тоже не нужна. Конечно, и при размере 10 может быть важно, есть ты мильон раз это запускаешь, но обычно, тараканов ловить, - занятие глупое, имхо.



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

Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.097 c
6-1264678262
madacar
2010-01-28 14:31
2013.03.22
Поиск письма на сервере


15-1330599411
Pit
2012-03-01 14:56
2013.03.22
Импорт интерфейсов из C# в Delphi


15-1334739336
oldman
2012-04-18 12:55
2013.03.22
Забыл решение...


2-1336658934
ignatich70
2012-05-10 18:08
2013.03.22
БД+Клиент/Сервер


15-1350457839
pasha_golub
2012-10-17 11:10
2013.03.22
Течет память. Кто виноват и что делать?





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