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...


Когда я запускаю программу, она очень долго отрабатывает данный цикл.
Может можно как-то по другому организовать данный цикл?


koha   (2007-10-15 23:29:00) [1]

- создал этих Пупкиных 1460160 одинаковых сторок и в разных местах 4 строки изменил
время ушло на загрузку и сортировку всего ~ 1.5 секунды (грубый подсчет), Процессор: Core 2 Duo T5600 (1,83 Mг).

необходимо исправить строки:
    LFull.Delete(i-1);
    LShort.Delete(i-1);
на:  
    LFull.Delete(T);
    LShort.Delete(T);


koha   (2007-10-15 22:58:00) [2]

- Сорри кучу ошибок исправил, ну вобщем работающий пример, но далек от совершенства.

var
 Form1: TForm1;
 LFull,LShort,LSource: TStrings;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i,N,T: integer;
   St: String;
begin
 st:='          '; // 10 цифр
 LFull   := TStringList.Create;
 LShort  := TStringList.Create;
 LSource := TStringList.Create;
 try
 LSource.LoadFromFile('c:\Archive\test.txt');
 //...........
 //загружаем LSource
 //......
 //представим, что уже загрузили LSource каким-нибудь способом

 N:=14;
 for i := 0 to LSource.Count - 1 do begin
   Move(LSource.Strings[i][N],ST[1],10);
   memo1.Lines.Add(st);
   T:=LShort.IndexOf(St);
   if T = -1 then begin
     LFull.Add(LSource.Strings[i]);
     LShort.Add(ST);
   end
   else begin
     LFull.Delete(i-1);
     LShort.Delete(i-1);
   end;
 end;
 //..................

 memo1.Text:=LFull.Text;

 finally
   LFull.Free;
   LShort.Free;
   LSource.Free;
 end;

end;


koha   (2007-10-15 22:33:00) [3]

- интересно, а такой алгоритм сколько работать будет?

var
 Form1: TForm1;
 LFull,LShort,LSource: TStrings;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i,N,T: integer;
begin

 //...........
 //загружаем LSource
 //......
 //представим, что уже загрузили LSource каким-нибудь способом

 N:=14;
 for i := 0 to LSource.Count - 1 do begin
   T:=LShort.IndexOf(LSource.Strings[i][n]);
   if T = -1 then begin
     LFull.Add(LSource.Strings[i]);
     LShort.Add(LSource.Strings[i][n]);
   end
   else begin
     LFull.Delete(i);
     LShort.Delete(i);
   end;
 end;
 //..................

end;


zorik   (2007-10-15 16:10:00) [4]


> Dennis I. Komarov ©

?


Dennis I. Komarov   (2007-10-15 16:07:00) [5]

Ох уж эти сказочки, ох уж эти сказочники (с)


zorik   (2007-10-15 15:58:00) [6]

1. Создать список записей
TMyItem = record
 Name: String;
 Code: String; (или Integer)
end;
2. Загрузить в список из файла
3. Отсортировать по Code
4. Пробежать по списку и удалять. Удалять так. Запомнить первое значение. Организовать цикл для проверки пока следующее равно сохраненному. Удалить от первого до того что нашли.
Пример удаления. Не проверял, набросал на скорую руку

var
 DeleteFirst: Boolean; //признак повторяючихся записей

i := 0;
while i <= List.Count - 2 do //на 1 меньше чем длина
begin
 TempCode := List[i].Code; //запомнили значение
 j := i + 1; //индекс следуещего значения
 DeleteFirst := False; //не удалять первое
 while TempCode = List[j] do
 begin
   if not DeleteFirst then
     DeleteFirst := True; //удалить первое
   //удаляем повторяющееся. j не увеличиваем, поскольку список ссунется
   List.Delete(j);
 end;
 //если были повторяющиеся -- удалить i-тое, иначе увеличить i
 if DeleteFirst then List.Delete(i) else i := i + 1;
end;


Anatoly Podgoretsky   (2007-10-15 11:28:00) [7]

А если будет только

Пупкин1 А.И. 3456378654
Пупкин3 С.Р. 3456378654


Тогда что?
В любом случае желательно применить какую ни будь базу, которая поддерживает SQL и работает в памяти (InMemoryDataset)


palva   (2007-10-15 11:11:00) [8]

> Должен удалится и 1 и 3 Пупкин а остаться только строка:
Тогда извините, я вас неправильно понял. Мой алгоритм palva ©   (12.10.07 16:02) [22] не подойдет


_max_   (2007-10-15 10:06:00) [9]


> А мне не понятно, почему должен удаляться Пупкин1, а не
> Пупкин3 и на каком основании, какая в этом цель.

Должен удалится и 1 и 3 Пупкин а остаться только строка:

Пупкин2 А.П. 4538293647

Но это, если файл состоит из 3 строк, а если из более чем 200000, это уже затрудняет процесс.
Тоесть, должны удалится все записи с повтряющимися номерами, а остаться только с уникальным номером.


Dennis I. Komarov   (2007-10-12 16:47:00) [10]

> [33] Anatoly Podgoretsky ©   (12.10.07 16:30)

На это суд всевышнего или random :)


Anatoly Podgoretsky   (2007-10-12 16:30:00) [11]

> _max_  (12.10.2007 16:17:31)  [31]

А мне не понятно, почему должен удаляться Пупкин1, а не Пупкин3 и на каком основании, какая в этом цель.


_max_   (2007-10-12 16:20:00) [12]


> Anatoly Podgoretsky ©   (12.10.07 16:12) [27]
> Огласите задачу, а не ваше представление как ее решать.Главное
> какая цель.


> _max_   (12.10.07 15:28) [15]


_max_   (2007-10-12 16:17:00) [13]


> И на всякий случай, в приведеном примере нет повторяющихся
> строк

Имелись ввиду части строк, как видно с данного примера.
Извините, если завел в заблуждение.


palva   (2007-10-12 16:17:00) [14]


> вставок в середину не будет

Фигню написал. Вставки будут, поскольку список отсортирован.


palva   (2007-10-12 16:15:00) [15]

> поэтому вставки в середину будут довольно затратными
Пардон, вставок в середину не будет, поскольку дубликаты игнорируются.


Anatoly Podgoretsky   (2007-10-12 16:14:00) [16]

И на всякий случай, в приведеном примере нет повторяющихся строк

Пупкин1 А.И. 3456378654
Пупкин2 А.П. 4538293647
Пупкин3 С.Р. 3456378654


Anatoly Podgoretsky   (2007-10-12 16:12:00) [17]

Огласите задачу, а не ваше представление как ее решать.
Главное какая цель.


palva   (2007-10-12 16:10:00) [18]

> TStringList? Какая разница, или содержимое файла я помещю в массив или в Strings?
Разница та, что ты вряд ли будешь осуществлять дихотомический поиск дубликата. А StringList будет. Правда StringList на самом деле никакой не список, а вектор, поэтому вставки в середину будут довольно затратными. Для большей эффективности можно использовать не StringList, а организовать двоичное дерево. Но это надо программировать самому.


_max_   (2007-10-12 16:08:00) [19]

Большое спасибо, palva, за пример.
Буду пробовать!


_max_   (2007-10-12 16:06:00) [20]

Понял, буду думать другие решения.
Всем спасибо за внимание!

Зы, думаю inex на меня не обиделся :)


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

Наверх

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