Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

усовершенствование цикла [D7]


Страницы:   1 2 3

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]

Ребята, ну подскажите тогда, пожалуйста, другой вариант.
Задача следующая. Есть тестовый файл с большим кол. строк.
В этом файле есть повторяющиеся записи. Нужно отфильтровать эти записи.
Делаю я следующим образом. Создал два массива элементы которых являлись строками файла. После чего я сравнивал кажый элемент первого массива с каждым элементом второго массива (приведенный вишецикл).
Согласен, что безобразно я это делаю, с точки зрения программирования, но задачу как-то нужно решить.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо