Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.03;
Скачать: CL | DM;

Вниз

Своеобразная   Найти похожие ветки 

 
Сергей   (2003-02-13 02:02) [0]

Есть около 1500 строк таблицы из примерно 10 столбцов, каждая ячейка - string. Мне нужно организовать быстрый поиск и отображение. Выглядеть все должно примерно так: есть tedit, есть tstringgrid, при изменении текста в tedit автоматически (и быстро!) меняется содержимое tstringgrid. Связь на уровне наличия текста из tedit`а в одном (конкретном) из полей строки.


 
Palladin ©   (2003-02-13 02:11) [1]

для быстроты тебе нужно использовать сортировку и бинарный поиск, быстрее некуда :)


 
Сергей   (2003-02-13 02:52) [2]

проблема в том, что я ищу не строки как таковые, а элементы строк. То есть если строка у записи "Long long stick", то по запросу "ic" она тоже должна быть найдена. Как это сделать?


 
Palladin ©   (2003-02-13 03:30) [3]

имхо
только перебор


 
Сергей   (2003-02-13 04:02) [4]

Перебор, то перебор. Но сама функция, проверяющая наличие подстроки в строке как должна быть реализована? Я 100% уверен, что стандартная реализация оставляет желать лучшего. Строки не длинные.

Кроме того интересует непосредственная реализация. Как это правильно отображать? Мне что-то не хочется запихивать по 1500 строк в grid при каждом новом символе..


 
stone ©   (2003-02-13 09:30) [5]

. > есть tedit, есть tstringgrid, при изменении текста в tedit
> автоматически (и быстро!) меняется содержимое tstringgrid


Если уж речь идет о базе данных, то лучше для отображения данных использовать TDBGrid и соответствующие компоненты доступа к данным.

> проблема в том, что я ищу не строки как таковые, а элементы
> строк. То есть если строка у записи "Long long stick", то
> по запросу "ic" она тоже должна быть найдена. Как это сделать?


запрос типа select * from MyTable where Field1 like "%ic%"


 
uw ©   (2003-02-13 09:47) [6]

>stone © (13.02.03 09:30)

У него база данных в кавычках. А если бы была и настоящая, то такой select все равно перебирал бы все.


 
Сергей   (2003-02-13 13:09) [7]

У меня нет конкретной базы. У меня есть просто информация. В файле. Я хочу чтобы моя программа работала на любом компе, и не хочу вместе с ней всем mysql раздавать. Порекомендуйте что-нибудь.. Мне нужно организовать подобие SELECT для моей таблицы. Не обязательно с нуля, но обязательно прозрачно для пользователя. Так, чтобы ему не пришлось ставить дополнительный софт.


 
Anatoly Podgoretsky ©   (2003-02-13 13:59) [8]

uw © (13.02.03 09:47)
Понятие база наступает, когда мы начинаем упорядоченно к этому относиться и работать как с базой. Сама база физически может и отсутствовать, например TClientDataset, ему не требуется физическое наличие данных.


 
uw ©   (2003-02-13 17:30) [9]

>Anatoly Podgoretsky © (13.02.03 13:59)
Всё, я в отпуске и на такие зловредные реплики не отвечаю. Когда вернусь, поговорим!


 
Anatoly Podgoretsky ©   (2003-02-13 17:50) [10]

:-)


 
MsGuns ©   (2003-02-13 18:28) [11]

Пиши вставку прямо на асме. Возвращает индекс найденной строки.
Если же хочешь, чтоб еще и в контроле все мгновенно отображалось, пиши на асме и свой контрол (типа стринггрида)


 
Сергей   (2003-02-13 19:34) [12]

Спасибо, блин.

2Anatoly Podgoretsky
(Понятие база наступает, когда мы начинаем упорядоченно к этому относиться и работать как с базой. Сама база физически может и отсутствовать, например TClientDataset, ему не требуется физическое наличие данных)

А более приближенно к реальности можно? Конкретно - каким образом я могу запихать таблицу в этот самый dataset, и как я должен делать оттуда выборку?

2MsGuns
(Пиши вставку прямо на асме. Возвращает индекс найденной строки.
Если же хочешь, чтоб еще и в контроле все мгновенно отображалось, пиши на асме и свой контрол (типа стринггрида))

меня алгоритм интересует. Как максимально быстро проверить наличие подстроки в строке? Точнее в 1500 строках.


 
MsGuns ©   (2003-02-13 19:51) [13]

Результат = 0
Цикл по строкам и Результат=0
Цикл по строке (пока "не равно" образцу) и (смещение < длины)
Модификация смещения
Возврат в начало цикла
Если смещение<Длины строки -> Результат = 1
Возврат в начало цикла

Что на асме, что на Паскале, что на Фортране - по барабану - если ты об алгоритме.
А вот скорость (т.е.кол-во выполненных инструкций) может быть совершенно разной - зависит от языка. Ничего быстрее асма, априори, быть не может.


 
MsGuns ©   (2003-02-13 19:51) [14]

Результат = 0
Цикл по строкам и Результат=0
Цикл по строке (пока "не равно" образцу) и (смещение < длины)
Модификация смещения
Возврат в начало цикла
Если смещение<Длины строки -> Результат = 1
Переход на след.строку
Возврат в начало цикла

Что на асме, что на Паскале, что на Фортране - по барабану - если ты об алгоритме.
А вот скорость (т.е.кол-во выполненных инструкций) может быть совершенно разной - зависит от языка. Ничего быстрее асма, априори, быть не может.


 
Anatoly Podgoretsky ©   (2003-02-13 20:14) [15]

MsGuns © (13.02.03 18:28)
Сергей (13.02.03 19:34)
Один из вариантов ускорения работы со StringGrid это работа в виртуальном режиме, отображать в нем не все строки, а только небольшое количество и динамически подкачивать в него данные. Сами данные можно хранить в чем угодно, хоть в StringList. Работать будет очень быстро, реализация конечно не очень простая, но есть готовые реализации на том же торри, еще вместо StringGrid можно использовть ListView, там это штатный режим.

Сергей (13.02.03 19:34)
Я тебе не могу представить готового примера для ClientDataset, я с ним мало работаю, но таких примеров видел много.
Посмотри что есть по этому поводу в хелпе, там есть готовые методы сохранение данных в файле в нескольких форматах.
ClientDataset очень удобен для работы с большими базами по низкосоростным каналам.

Тебе возможно стоит задать отдельный вопрос, спечиально по ClientDataset, тогда смогут подключиться люди которые с ним тесно работают, так его понимание не очень простое.

Кроме того можешь поискать на торри компоненты, которые работают с плоскими базами в текстовом формате, давно я видел один хороший, название не помню, но что то начинается с QDB, конечно есть еще много и других.


 
Сергей   (2003-02-13 20:44) [16]

Это один из самых медленных алгоритмов для поиска подстроки. Можно гораздо быстрее, естесственно с предварительной подготовкой. Ладно, спасибо попробую поразбираться с dataset.


 
Tux ©   (2003-02-13 21:52) [17]

НАСТОЯТЕЛЬНО И ОГЛУШИТЕЛЬНО ОРУ!!! ПРЕКРАТИТЕ ИЗОБРЕТАТЬ ВЕЛОСИПЕДЫ! ВСЕ ХРЕНОВО НАПИСАННЫЕ ПРОГРАММЫ - НА 99% - ОТ ХРЕНОВО НАПИСАННЫХ САМОДЕЛЬНЫХ АЛГОРИТМОВ!
Облегчил душу :)
Итак. Скачиваем MDAC 2.7. Создаем ODBC соединение, используя MS ODBC Driver для текстовых файлов. Файл может быть с фиксированной длиной полей либо с разделителями. Подключаемся через BDE либо OLEDB провайдера для ODBC драйверов. Используем вылизанные борландом компоненты для работы с БД. Тратим полчаса и наслаждаемся результатами. Можно делать селекты, делиты, апдейты и инсерты. Можно делать выборки из двух текстовых файлов как если бы мы работали с таблицами. Если вы работаете через ADO - воспользуйтесь прелестями ADORecordset.
Уф.
Все.


 
Tux ©   (2003-02-13 21:55) [18]

Да, кстати, по скорости этот пресловутый драйвер оптимизирован на твердую четверку с твердым плюсом. Все равно лучше не напишете. За разумные сроки.
Кстати, оператор like тоже, представьте себе, работает.


 
Сергей   (2003-02-14 19:26) [19]

Спасибо. Наконец-то рассказали как делать именно то, о чем я мечтал. Спасибо.


 
Anatoly Podgoretsky ©   (2003-02-14 19:34) [20]

На здоровье, но про вывод бы рассказал все таки


 
blackman ©   (2003-02-14 20:55) [21]

Однако посрамлены все. Работать это создание через ODBC или ADO будет так медленно и туго, что потом проще всего будет править эту базу в текстовом редакторе



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

Текущий архив: 2003.03.03;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.016 c
6-5692
KoHe4Ho }|{e 6ot
2003-01-12 22:30
2003.03.03
Аспекты с сетью


1-5578
NAlexey
2003-02-19 16:01
2003.03.03
Handle в WindProc?


3-5457
mate
2003-02-13 17:41
2003.03.03
Упорядочить Grid


1-5587
cassy
2003-02-19 09:18
2003.03.03
Обработка исключений


14-5870
Вячеслав
2003-02-14 14:13
2003.03.03
WM_SYSCOMMAND значение SC_MOVE