![]() |
| ||
|
|
Новости |
Поиск |
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...
Когда я запускаю программу, она очень долго отрабатывает данный цикл.
Может можно как-то по другому организовать данный цикл?
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 на меня не обиделся :)