![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы
![]() |
Поиск в этой теме
![]() |
![]() |
#1 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]()
Имеется динамический массив не сортированных строк (их расположение имеет значение), строки длинные, их содержание и количество не важно и будут меняться. Собственно нужна скорость. Пишу на Дельфи, но меня прежде всего интересует алгоритм, поэтому пишу здесь. Какие будут варианты? Я сам думаю брать первый символ строки и искать сначала по нему, а уж потом проводить полное сравнение. Можно как вариант искать еще и по длине. Скажу сразу длина строк может быть любая и нуль и мегабайты.
Смысл затеи не добавлять дубликатов - массив должен содержать только уникальные строки.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() |
![]() |
![]() |
![]() |
#2 |
Trust no one.
Старожил
Регистрация: 07.04.2009
Сообщений: 6,526
|
![]()
Идея с первым символом хорошая, но все это будет остаточно долго - необходимо ннайти оптимальное количество символов по которым будет проходить пошаговый поиск с применением сравнения областей памяти.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ |
![]() |
![]() |
![]() |
#3 |
not
Участник клуба
Регистрация: 27.06.2009
Сообщений: 1,399
|
![]() Код:
|
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]()
а я бы рекомендовал посмотреть на решение проблемы с другой стороны - никто же не мешает завести динамический массив (или список/коллекцию - не суть важно) с номерами (индексами) строк и отсортировать его по значениям строк.
Тогда в этой структуре достаточно сравнивать соседние элементы (строки с этими индексами). p.s. Предложенный выше алгоритм - это банальное индексирование данных. ![]() p.p.s. а вообще, решение задачи ОЧЕНЬ сильно зависит от конкретных деталей (могут ли строки добавляться/удаляться, часто ли происходит изменение данных, какие требования к скорости (может банальнейший TSTringList + IndexOf по скорости устроит... ) и т.д. и т.п.... |
![]() |
![]() |
![]() |
#5 |
Участник клуба
Регистрация: 23.04.2009
Сообщений: 1,058
|
![]()
можно попробовать разделить разделись массив скажем на N и в N потоках сравнить.
Или этот масив строк скидывать в БД а там уже оптимальным запросом сравнивать. Сделать поле уникальным и БД сама будет это контролировать.
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
|
![]() |
![]() |
![]() |
#6 | ||
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]() Цитата:
VintProg, я думаю мой вариант быстрей. Цитата:
Насчет БД - это уже излишество. Задача сводиться к созданию определенной универсальной структуры данных. А если она еще и БД требовать начнет... Это не по-фень-шую.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() Последний раз редактировалось Utkin; 30.06.2010 в 12:58. |
||
![]() |
![]() |
![]() |
#7 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
для начала строки какие?
Null Terminated или Lengthed?(или гибрид, как(вроде б) string) если второе или третье то можно сначало длину сравнить, ну а затем POS проще будет я думаю(хотя на асме можно ускорить это...scasb/w(смотря какие строки)) Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]()
До 4-х гигабайт
![]()
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() |
![]() |
![]() |
![]() |
#10 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]()
Да. В массиве могут храниться любые строки, включая пустую. Мне нужно поместить в этот же массив еще одну строку (тоже произвольную), но при условии, чтобы она уже не была добавлена в массив. Далее строки за ненадобностью будут удаляться из массива (из любого места). Далее строка может быть изменена (и нет никаких правил их изменения).
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Сравнение строк | Jasper92 | Общие вопросы C/C++ | 6 | 23.12.2009 12:49 |
сравнение строк -? | Evgenii | Общие вопросы Delphi | 10 | 15.07.2009 15:28 |
С++. Сравнение строк | maxlav | Помощь студентам | 8 | 25.06.2009 04:33 |
Сравнение строк | Elm0 | Паскаль, Turbo Pascal, PascalABC.NET | 2 | 02.06.2008 09:31 |
Сравнение строк | HOMER | Общие вопросы Delphi | 7 | 04.01.2008 05:53 |