Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.02.2011, 22:58   #1
Federal
Пользователь
 
Регистрация: 21.05.2010
Сообщений: 77
Восклицание Удалить повторы строк

У меня в Мемо1 список предметов, в Мемо 2 второй список предметов
Мемо1
Цитата:
Дерево
Зуб
Лопата
Носоковырялка
Мемо2
Цитата:
Матрас
Палас
Зуб
Лопата
Ложка
Список примерно около 500 000 наименований
Как замутить так чтобы в Мемо 2 все те предметы которые есть в Мемо 1 были удалены, причем что бы все это безобразие не тормозило?
Federal вне форума Ответить с цитированием
Старый 22.02.2011, 23:39   #2
Federal
Пользователь
 
Регистрация: 21.05.2010
Сообщений: 77
По умолчанию

Код:
var
i,k: integer;
procedure TForm1.Button1Click(Sender: TObject);
for i:=0 to Memo1.Lines.Count-1 do
  begin
  for k:=0 to Memo2.Lines.Count-1 do
    begin
    if Memo1.Lines[i]<>Memo2.Lines[k] then Memo3.Lines.add(Memo2.Lines[k]);
    end;
  end;
end;
Это дело естественно виснет

Последний раз редактировалось Federal; 22.02.2011 в 23:42.
Federal вне форума Ответить с цитированием
Старый 22.02.2011, 23:51   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

тот же самый код с пересчетом строк memo1 и memo2 только используй эти функции: AnsiCompareStr
или
AnsiCompareText
Человек_Борща вне форума Ответить с цитированием
Старый 22.02.2011, 23:57   #4
Federal
Пользователь
 
Регистрация: 21.05.2010
Сообщений: 77
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
тот же самый код с пересчетом строк memo1 и memo2 только используй эти функции: AnsiCompareStr
или
AnsiCompareText
в моем случае я хочу избежать пересчет строк
500 000 строк умножить на 500 000 строк это 250 000 000 000 циклов комп захлебывается когда пытается обработать такой цикл

Последний раз редактировалось Federal; 23.02.2011 в 00:02.
Federal вне форума Ответить с цитированием
Старый 23.02.2011, 00:15   #5
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

помоему тут не обойтись без этого количества просмотров. можно воспользоватся например бинарным поиском, но обязательное условие - сортированные данные.
onewho вне форума Ответить с цитированием
Старый 23.02.2011, 00:24   #6
Federal
Пользователь
 
Регистрация: 21.05.2010
Сообщений: 77
По умолчанию

Цитата:
Сообщение от onewho Посмотреть сообщение
помоему тут не обойтись без этого количества просмотров. можно воспользоватся например бинарным поиском, но обязательное условие - сортированные данные.
Ну допустим я данные сортирую по алфавиту, пни меня в нужное напрваление, или лучше пример
Federal вне форума Ответить с цитированием
Старый 23.02.2011, 00:39   #7
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

я бы и рад помочь да особо не знаю чем.
в С есть готовая функция bsearch, в паскале по-видимому нет
вот что нашел- тут вроде неплохо описано
http://www.cyberguru.ru/programming/...ia-page19.html
если функция вернула 0 переносить слово(ключ), иначе не переносить...
onewho вне форума Ответить с цитированием
Старый 23.02.2011, 06:23   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ребят, ну что же Вы велосипед изобретаете.
Когда всё изобретено до нас

1) откажитесь от Memo
(используйте TStringList)
Это тоже самое, что Memox.Lines только отсутствие визуализации очень положительно скажется на быстродействии.

2) отсортируйте первый список :
TS1.Sort;

3) цикл по второму списку и те значения, которых нет в TS1 - переносите в третий список (это, в общем случае, будет быстрее, чем удалять элементы списка)
для поиска элементов в TS1 используйте метод Find
примерно так:
Код:
  TS1.Sort;
  TS3.Clear;
  for i:=0 to TS2.Count-1 do
     if Not TS1.Find(TS2.Strings[i], Index)  then TS3.Append(TS2.Strings[i]);
4) в любом случае за считанные мгновения данная задача решена не будет (ибо 500 тысяч - это 500 тысяч)
Если нужно часто и быстро решать подобную задачу - пересматривайте логику работы.

5) для решения подобной задачи целесообразно, имхо, использовать SQL + хорошую большую мощную СУБД: MS SQL, Oracle и т.д. Они "заточены" под эффективную обработку огромных массивов информации...

p.s. а откуда подобные задачи возникают, если не секрет?...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.02.2011, 11:17   #9
Federal
Пользователь
 
Регистрация: 21.05.2010
Сообщений: 77
По умолчанию

Спасибо, это уже в разы грамотно...
Я брутил сервер игры Lineage, проверил первую базу аккаунтов
их там 250 000 ак, откапал вторую базу в 500 000 аккаунтов,
ну и мне естественно не хотелось что бы во второй базе не встречались аккаунты из первой базы.
Вот откуда такая задача мне пришла. Порылся в интернете в поиске готовой программы, но толкового не нашел...
Попробывал сам состряпать с мизерными знаниями Delphi, оказалось не все так просто
Federal вне форума Ответить с цитированием
Старый 23.02.2011, 14:14   #10
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

Цитата:
Сообщение от Federal Посмотреть сообщение
Спасибо, это уже в разы грамотно...
Я брутил сервер игры Lineage, проверил первую базу аккаунтов
их там 250 000 ак, откапал вторую базу в 500 000 аккаунтов,
ну и мне естественно не хотелось что бы во второй базе не встречались аккаунты из первой базы.
Вот откуда такая задача мне пришла. Порылся в интернете в поиске готовой программы, но толкового не нашел...
Попробывал сам состряпать с мизерными знаниями Delphi, оказалось не все так просто

ахахахах!
я месяц назад именно для этой цели (отсев повторов аккаунтов) писал прожку. работает она напролом конечно , ну 100к аккаунтов гдето за 30 сек обрабатывает. не такие уж там и тормоза как ты написал.
onewho вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
удалить повторы FAiver Общие вопросы Delphi 5 21.10.2010 20:45
Повторы в ListView Shouldercannon Общие вопросы Delphi 2 21.10.2010 13:52
Как в удалить кучу строк, через одну? levohotnik Microsoft Office Excel 6 09.09.2010 21:08
повторы в Random Natok Помощь студентам 4 26.05.2009 17:41
Убрать повторы ShnapS БД в Delphi 4 15.05.2009 23:03