![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
усовершенствование цикла [D7]
inex © (2007-10-12 14:22:00)Подскажите пожалуйста, можно ли как-то усовершенствовать следующий цикл:
var
a, b : array[0.500000] of string;
i, y : integer;
...
//заполняются элементы массивов
...
for i:=0 to 500000 do
for y:=0 to 500000 do
if a[i]=b[y] then...
Когда я запускаю программу, она очень долго отрабатывает данный цикл.
Может можно как-то по другому организовать данный цикл?
palva (2007-10-12 16:04:00) [21]> Надо сразу сказать
Надо сразу установить такие свойства StringList
palva (2007-10-12 16:02:00) [22]Надо сразу сказать, что StringList будет отсортированным и игнорирующим повторы. Метод add будет возвращать индекс. Пример:
{$APPTYPE CONSOLE}
uses Classes;
var
sl: TStringlist;
begin
sl := TStringlist.Create;
sl.Sorted := True;
sl.Duplicates := dupIgnore;
WriteLn(sl.Add('14321234')); // 0
WriteLn(sl.Add('14321235')); // 1
WriteLn(sl.Add('14321236')); // 2
WriteLn(sl.Add('14321237')); // 3
WriteLn(sl.Add('14321236')); // 2
WriteLn(sl.Add('14321237')); // 3
sl.Free;
end.
Вы видите, что если добавляемая строка в списке уже есть, то возвращается не индекс добавленной строки, а индекс существующей. Отсюда алгоритм:
Создается TStringList. Читается входной файл и переписывается в выходной. Из каждой строки извлекаем значение второго столбца и пытаемся добавить в список. Если возвращаемый индекс равен индексу последней добавленной строки плюс единица, то строка дубликатов (пока) не имеет - переписываем ее в выходной файл и обновляем последний добавленный индекс. В противном случае строку игнорируем.
Dennis I. Komarov (2007-10-12 15:45:00) [23]> [18] _max_ (12.10.07 15:38)
- У вас гранаты учебные?
- В своем роде учебные, а вообще нет.
:)
> [19] _max_ (12.10.07 15:41)
Если хочешь извращаться:
1. Загрузить в TStringList
2. Отсортировать
3. Удалить повторы.
Сергей М. (2007-10-12 15:44:00) [24]
> максимализировать
Эт чиво такое ?)
Ты к постам Маши Шрайбер (С) проникся вообще-то ?)
_max_ (2007-10-12 15:41:00) [25]
> Базу тебе надо нормальную, с ключом и индексами. А не это
> файлы текстовые
Это то ясно, ну а все-таки, как можно ли как-то максимализировать процесс сортировки?
_max_ (2007-10-12 15:38:00) [26]
> Так это учебная задача? Или нет?
В своем роде учебная, ну как самообразование.
А вообще нет!
Dennis I. Komarov (2007-10-12 15:36:00) [27]> [15] _max_ (12.10.07 15:28)
Базу тебе надо нормальную, с ключом и индексами. А не это файлы текстовые
Маша Шрайбер (2007-10-12 15:32:00) [28]>> _max_ (12.10.07 15:28) [15]
Так это учебная задача? Или нет?
_max_ (2007-10-12 15:28:00) [29]Задача стоит конкретно. Есть файл со строками:
Пупкин1 А.И. 3456378654
Пупкин2 А.П. 4538293647
Пупкин3 С.Р. 3456378654
...
И так 235000 строк.
Как видно число 3456378654повторяется в 2 строках как минимум
(не исключено, что далее оно еще повстречается). Нужно с этого файла выбрать все записи с неповторяющимся числом (2 столбец).
Просто в голову ничего не приходит, как использование массивов.
Вот что-бы было что-то на подобе хешов!
Zeqfreed (2007-10-12 15:20:00) [30]Задача сводится к сортировке и последующему удалению повторяющихся идущих друг за другом строк.
Маша Шрайбер (2007-10-12 15:20:00) [31]>> _max_ (12.10.07 15:13) [12]
Для гордого показа своего успешного решения преподу достаточно на 10*10 строках.
Если не поставлена специальная задача оптимизации.
_max_ (2007-10-12 15:13:00) [32]
> Как видно, это вам дали такое учебное задание. Тогда вопросы
> скорости вас не должны беспокоить. А только лишь алгоритмика
Не совсем так! В принципе ничего страшного не было бы, если данная задача выполнялася ну скажем за минут 5. Но не 2, 3 и более часов, как в моем примере.
Маша Шрайбер (2007-10-12 15:05:00) [33]>> _max_ (12.10.07 14:54) [7]
>> _max_ (12.10.07 14:57) [8]
Как видно, это вам дали такое учебное задание. Тогда вопросы скорости вас не должны беспокоить. А только лишь алгоритмика.
_max_ (2007-10-12 15:04:00) [34]
> Мне всеже интересно, откуда взято "500000"?
Ну не 500000, а 235000 - кол-во строк файла.
Это я так, к примеру написал.
Dennis I. Komarov (2007-10-12 14:57:00) [35]Мне всеже интересно, откуда взято "500000"?
_max_ (2007-10-12 14:57:00) [36]
> TStringList + F1 и читать и думать, и читать и думать!
TStringList? Какая разница, или содержимое файла я помещю в массив или в Strings? Что там что там я буду перелистывать все допустимые варианты данным циклом?
_max_ (2007-10-12 14:54:00) [37]
> Именно своими средствами ? Или воспользоваться готовыми
> не возбраняется ?
Своими, т.к. это одна из многочисленных задач, которые мне нужно будет решить. И все они отличаются друг от друга, но и в то же время все они будут работать с подобными циклами.
Сергей М. (2007-10-12 14:51:00) [38]
> задачу как-то нужно решить
Именно своимисредствами ? Или воспользоваться готовыми не возбраняется ?
Маша Шрайбер (2007-10-12 14:46:00) [39]TStringList + F1 и читать и думать, и читать и думать!
_max_ (2007-10-12 14:43:00) [40]Ребята, ну подскажите тогда, пожалуйста, другой вариант.
Задача следующая. Есть тестовый файл с большим кол. строк.
В этом файле есть повторяющиеся записи. Нужно отфильтровать эти записи.
Делаю я следующим образом. Создал два массива элементы которых являлись строками файла. После чего я сравнивал кажый элемент первого массива с каждым элементом второго массива (приведенный вишецикл).
Согласен, что безобразно я это делаю, с точки зрения программирования, но задачу как-то нужно решить.