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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2013, 14:47   #1
Lifeda92
Пользователь
 
Регистрация: 15.08.2012
Сообщений: 39
По умолчанию Требуется совет по улучшению алгоритма в программе по сортировке доменов. (Delphi 7)

Здравствуйте, сделал программу которая сортирует mail;pass по доменам и сохраняет в отдельный текстовый документ.

Посоветуйте пожалуйста как ускорить обведенную часть кода в коде ниже, а то эта версия кода при загрузке текстового файла длинной в 10000 строк и более очень долго сортирует или вообще не работает.

Уже все перепробовал, в голову лезет только этот алгоритм...

Дайте пожалуйста совет новичку.

Заранее благодарен.

Вот код:


Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, sSkinManager, ExtCtrls, sPanel, StdCtrls, sEdit, sButton, jpeg,
  sGroupBox, sLabel;

type
  TForm1 = class(TForm)
    sknmngr1: TsSkinManager;
    btn1: TsButton;
    edt1: TsEdit;
    spnl1: TsPanel;
    spnl2: TsPanel;
    btn2: TsButton;
    img1: TImage;
    lbl1: TLabel;
    dlgOpen1: TOpenDialog;
    grp1: TsGroupBox;
    lbl2: TsLabel;
    lbl3: TsLabel;
    grp2: TsGroupBox;
    lbl4: TLabel;
    lbl5: TLabel;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TNewThread = class(TThread)
  protected
  procedure Execute; override;
  end;

var
  Form1: TForm1;
  ss,ee: TStringList;
  dir: string;

implementation

{$R *.dfm}


////////////////////////////////////////
procedure TNewThread.Execute;         //
var i,a,b,t,q,w,n: Integer;           //
    c,r: string;                      //
begin                                 //
ee:=TStringList.Create;               //
ee.Sorted:=True;                      //
ee.Duplicates:=dupIgnore;             //
for i:=ss.Count-1 downto 0 do         //
begin                                 //
ee.Clear;                             //
a:=Pos('@',ss[i])+1;                  //
b:=Pos(';',ss[i]);                    //
c:=lowercase(Copy(ss[i],a,b-a));      //
n:=n+1;                               //
form1.lbl5.caption:=inttostr(n);      //
for t:=ss.Count-1 downto 0 do         //
begin                                 //
ee.Add(ss[i]);                        //
q:=Pos('@',ss[t])+1;                  //
w:=Pos(';',ss[t]);                    //
r:=lowercase(Copy(ss[t],q,w-q));      //
if c=r then                           //
ee.Add(ss[t]);                        //
end;                                  //
CreateDir(dir+'\domen');              //
ee.SaveToFile(dir+'\domen\'+c+'.txt');//
end;                                  //
ss.Clear;                             //
SetCurrentDir(dir);                   //
end;                                  //
////////////////////////////////////////




procedure TForm1.btn1Click(Sender: TObject);
begin
GetDir(0,dir);
ss:=Tstringlist.Create;
ss.Sorted:=True;
ss.Duplicates:=dupIgnore;
if dlgOpen1.Execute then
begin
if dlgOpen1.FileName>IntToStr(-1) then
ss.Clear;
edt1.Clear;
edt1.Text:=dlgOpen1.FileName;
ss.LoadFromFile(dlgOpen1.FileName);
lbl3.Caption:=IntToStr(ss.Count);
lbl5.Caption:=IntToStr(0);
end
else
lbl3.Caption:=IntToStr(ss.Count);
lbl5.Caption:=IntToStr(0);
end;


procedure TForm1.btn2Click(Sender: TObject);
var NewThread: TNewThread;
begin
NewThread:=TNewThread.Create(True);
NewThread.FreeOnTerminate:=True;
NewThread.Priority:=tpNormal;
NewThread.Resume;
end;

end.
Lifeda92 вне форума Ответить с цитированием
Старый 12.07.2013, 15:05   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

масштабы очень не "детские"...
и что значит "очень долго" сортирует? Одну минуту? Полчаса? Восемь часов?
про "или вообще не работает" - я уже промолчу!

попробуйте.
1. выбросить сортировку в отдельной нити (потоке).
2. TStringList позволяет указать функцию сравнения (пользовательскую) и сортировать по ней - пример, см. тут
отсортируйте StringList, а потом уже сохраняйте данные по доменам, за один проход. (только не думаю, что через отдельные TStringList'ы это будет быстрее - просто создавайте текстовый файл и пишите в него).


p.s. а вообще, меня терзают смутные сомнения.. Вы что, какую-то зловредную дрянь пишете?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.07.2013, 15:09   #3
Lifeda92
Пользователь
 
Регистрация: 15.08.2012
Сообщений: 39
По умолчанию

Спасибо большое за совет.
Lifeda92 вне форума Ответить с цитированием
Старый 12.07.2013, 15:15   #4
Lifeda92
Пользователь
 
Регистрация: 15.08.2012
Сообщений: 39
По умолчанию

Цитата:
p.s. а вообще, меня терзают смутные сомнения.. Вы что, какую-то зловредную дрянь пишете?!
Просто нашел такую программу в интернете и решил сделать аналогию без задних мыслей (просто было интересно смогу ли я похожую программу написать).
Lifeda92 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нарисовать блок-схему алгоритма по готовой программе. Чешир Помощь студентам 1 20.05.2013 21:29
люди ,совет... по реализации алгоритма сергей30001 Помощь студентам 1 08.02.2012 13:42
требуется написать программу по сортировке числовых массивов в паскале Antoxa93 Помощь студентам 4 29.04.2011 20:47
Исследование алгоритма перебора вариантов с отсечением )помогите ,дайте нормальный совет Baralgin91 Помощь студентам 0 29.06.2009 17:50