喫茶XRAYトップページ

[スレッド全体
]

[7276] StringList ソートの速さ比べ返信 削除
2014/2/28 (金) 16:57:19 taki
StringListに逐次データが追加される場合、追加の度にsortメソッドを実行するより
最初から Sorted := true; にする方が断然速いようです。

※私のPCの環境では…

// 追加後Sort  1,267ms 1,000回 (※10,000回だとなかなか帰ってこない)
  for i := 1 to 1000 do begin
    sl.Append(FormatCurr('000000',Random(1000000)));
    sl.Sort;
  end;

// 初めからTrue 77ms 10,000回
  sl.Sorted := true;
  for i := 1 to 10000 do begin
    sl.Append(FormatCurr('000000',Random(1000000)));
  end;

// ちなみに 追加のみ 5ms 10,000回
  sl.Sorted := false;
  for i := 1 to 10000 do begin
    sl.Append(FormatCurr('000000',Random(1000000)));
  end;

データを最後に追加してから並べ替えるより、データを突っ込むところを探して
追加する方が速いのでしょうね。たぶん。



[7285] Re:StringList ソートの速さ比べ返信 削除
2014/3/1 (土) 08:25:39 たてぐや
▼ takiさん

私はこんなコードを長年使っています。参考になれば。


procedure TFrmMain.GridSort(Grid: TStringGrid; SortCol: Integer);
{===============================================================================
グリッドをソートする。
===============================================================================}
var
  str_St1: TStringList;
  str_St2:  TStringList;
  int_i: Integer;
begin
  str_St1 := TStringList.Create;
  str_St1.Assign(Grid.Cols[SortCol]);

  for int_i := 1 To Grid.FixedRows Do str_St1.Delete(0);
  for int_i := 0 to str_St1.Count - 1 do
        str_St1.Strings[int_i] := str_St1.Strings[int_i] + #1 + Format('%.10d',[int_i]);
  for int_i := Grid.FixedRows to Grid.RowCount - 1 do begin
    str_St2 := TStringList.Create;
    str_St2.Assign(Grid.Rows[int_i]);
    str_St1.Objects[int_i - Grid.FixedRows] := str_St2;
  end;
  str_St1.Sort;

  for int_i := Grid.FixedRows to Grid.RowCount - 1 do begin
    Grid.Rows[int_i].Assign(TStringList(str_St1.Objects[int_i -
    Grid.FixedRows]));
    TStringList(str_St1.Objects[int_i - Grid.FixedRows]).Free;
  end;
  str_St1.Free;
end;


[7286] Re2:StringList ソートの速さ比べ返信 削除
2014/3/1 (土) 11:10:46 taki
▼ たてぐやさん
 
> 私はこんなコードを長年使っています。参考になれば。

たてぐやさん ありがとうございます。
でも、残念ながら私の能力不足のためコードが読み解けません。(T_T)

str_St1.Assign(Grid.Cols[SortCol]);とかは分かります。
ソートのKeyとなるデータをstr_St1にコピーしているのですね。

for int_i := 1 To Grid.FixedRows Do str_St1.Delete(0);は見出しの
部分を取り除いて…

for int_i := 0 to str_St1.Count - 1 do
  str_St1.Strings[int_i] := str_St1.Strings[int_i] +
   #1 + Format('%.10d',[int_i]);
ではKeyとなるデータの後に#1とIndexをくっつけて記憶して…

次に、str_St2.Assign(Grid.Rows[int_i]);では
Gridの行のデータ(レコード単位)をStr_St2にコピーして、

str_St1.Objects[int_i - Grid.FixedRows] := str_St2;で
それをオブジェクトとしてStringListに代入?して・・・

つまり、Str_St1にはKeyの文字列とGridの行のデータを持った状態で
Str_St1.Sortする?

その後、
Grid.Rows[int_i].Assign(TStringList(str_St1.Objects[int_i -
    Grid.FixedRows]));では
str_St1に保存したオブジェクトをTStringListとして取り出して
さらにGridのRowデータとしてコピー(書き換え)する。

で、正しいでしょうか?


[7287] Re3:StringList ソートの速さ比べ返信 削除
2014/3/1 (土) 11:30:35 taki
えっ!
 
> for int_i := 0 to str_St1.Count - 1 do
>   str_St1.Strings[int_i] := str_St1.Strings[int_i] +
>    #1 + Format('%.10d',[int_i]);
> ではKeyとなるデータの後に#1とIndexをくっつけて記憶して…
>


 #1 + Format('%.10d',[int_i]) の部分の役割が…


[7293] Re4:StringList ソートの速さ比べ返信 削除
2014/3/3 (月) 08:27:34 TS
▼ takiさん

良く見ていませんが
>#1 + Format('%.10d',[int_i]) の部分の役割が…
これで同じデータが続いた場合、そのデータ分の元の行の順番は
保たれると思います。

[7294] Re5:StringList ソートの速さ比べ返信 削除
2014/3/3 (月) 16:15:29 taki
▼ TSさん

> これで同じデータが続いた場合、そのデータ分の元の行の順番は
> 保たれると思います。


了解です。

[7295] Re6:StringList ソートの速さ比べ返信 削除
2014/3/3 (月) 16:22:48 TS
▼ takiさん

ちなみに私はDelFusaさんのサイトのNifty の FDELPHI のサンプル蔵アーカイブ
内の下記を使わせてもらっています。

StringGridの並べ替え(2重)
http://delfusa.main.jp/delfusafloor/archive/www.nifty.ne.jp_forum_fdelphi/samples/00092.html


[7297] Re7:StringList ソートの速さ比べ返信 削除
2014/3/3 (月) 18:25:02 Mr.XRAY
こんなのもありますね.
データ量にもよりますが,バブルソートが早いのかな ?

[StringGrid でソートをしたい(1)]
http://hp.vector.co.jp/authors/VA015850/delphi/tips/grid05.html

[StringGrid でソートをしたい(2)]
http://hp.vector.co.jp/authors/VA015850/delphi/tips/grid06.html

[StringGrid でソートをしたい(3)]
http://hp.vector.co.jp/authors/VA015850/delphi/tips/grid07.html

ソートはまだ研究がおこなわれている分野のようです.
数年前に,新しいアルゴリズムの発表が,数学関係の分野であったようです.


[7299] Re8:StringList ソートの速さ比べ返信 削除
2014/3/4 (火) 10:22:10 おかぽん
▼ Mr.XRAYさん

> [StringGrid でソートをしたい(2)]
> http://hp.vector.co.jp/authors/VA015850/delphi/tips/grid06.html


> QuickSort は不安定なソートなので問題がある
との記載がありますけど、

> [StringGrid でソートをしたい(3)]
> http://hp.vector.co.jp/authors/VA015850/delphi/tips/grid07.html


>あ、関数ってポインタで引き渡せるんですよ(笑)
>知らなかった人、そういうものなんです(苦笑)

それなら、「複数列で比較できる関数」をポインタで渡すという解決方法を提示すれば、
QuickSortでもいいんじゃなかと思ったり、思わなかったり。

といいながら、「StringGrid でソートをしたい」の記事を参考にしたという
高速化されたソートの記事をコピペ
[高速マージソート]
http://drang.s4.xrea.com/program/tips/list/sort_mergesort.html


高速化の方法を考えるのが楽しかった時代は、もはや過去の事。
今は、イカに楽して実現するかのほうが主体で、速度はなんて二の次になってます。
PCのスペックも向上したので、それほど気にしなくていいんですよ(たぶん)

[▼次のスレッド]
INCM/CMT
Cyclamen v3.82