ソートロジック大会

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
メッセージ
作成者
omasu
記事: 96
登録日時: 2005年9月02日(金) 22:15
連絡する:

イグトランスさんへ質問(難問)です

#31 投稿記事 by omasu »

お世話になります。

イグトランスさんのコードを実用化(利用・借用・横領?)(~O~)したいと思います。

CSVファイルのキーを1列目と2列目とする前提条件を
 もし、仮に2列目、1列目、4列目、3列目をキーとする
  条件にした場合、どのようなコーディングをすればよいかを教えてください。

エクセルでのソートキーは3列までしか対応していません
 もし、可能であればソートキー列を前段の定義で指定できれば
  SortKey(2,1,4,3)とか
  非常に実用的なプログラムが作成可能です。

コード: 全て選択

Function GetKeyPart$(ByVal str As String) As String
    Dim Length As Long, PartA As Long, PartB As Long
    PartA = InStr(1, str, ",")
    If PartA > 0 Then
        PartB = InStr(PartA + 1, str, ",")
        If PartB > 0 Then
        End If
    End If
    GetKeyPart$ = str
End Function
淡幻星
記事: 183
登録日時: 2005年7月19日(火) 07:02
お住まい: 宮城県
連絡する:

Re: 中間結果のご報告について

#32 投稿記事 by 淡幻星 »

≫omasuさん
不完全なプログラムを投稿したまま放置した形になってしまい、すいません。
あの後、私事でちょっとテンパッテまして、
ここ半月くらいABにさっぱり触れていないもので、
Ver3.x以降への移植も、テストも、レスも何も出来ませんでした。
この後のもう1週間以上は触れられそうに無いです・・・。

さて、本題なのですが
> ごめんなさい、もう少し、お待ちください m(_ _)m
のヒトコトに、もう大変恐縮している次第でございます。
や、もう本当にスイマセンm(_ _)m
私のクイックソートのコードは、1年以上前に
「とりあえず動くからこれでいいや」の気持ちで、
初めて組んだソート関数なので、
クイックソート初構築の際に参考になればと思い投稿しただけで、
速度計測大会に参加できるような立派な品物ではありません。

そんなわけで、他の皆様方のコードに比べて、
速度はそんなに期待できないと思いますので、
Ver4.xへの移植&テストは大変ですから、
わざわざしてくださらなくても結構ですよ(苦笑)。

私自身さっぱりしていないのに、そこまで手を煩わすのは気が引けます。

Cのサンプルを基にとりあえず移植して、
デバックしながらどうにかクイックのアルゴリズムを理解した、
そんなレベルです。そのまま放置中のコードです(汗)。

そのうえ、Ver2.xの曖昧性を利用&小規模データ(4096件くらいまで)ソートを
前提にしていますので、厳密になったVer3.x以降&
大規模データソートへの移植はあちこち書き換える必要が
あるので、面倒だと思いますし。
実際問題としては、そのうち移植を行おうと思っているのですが、
今現在そこまで必要性がないことと、これだけ他の方の優秀な
コードが出揃ってしまったいるので、そのまま利用させていただこうかと
思うこともあり、延ばし延ばしになっていますf(^^;)



≫河川屋さん
ずいぶん前の投稿へのレスになりますが。
> クイックが不当な評価を
どうも不快感を与えてしまったようです、すいません。
私自身はクイックを批判するどころか、むしろ一番好んでますよ?
だから「王道」と言ったのですからw
マティ
記事: 161
登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
連絡する:

#33 投稿記事 by マティ »

自分の方法でよければ・・・複数行に対応したコードをホームページに乗せてあります。

ちなみに、例題で出ていた2列目、1列目、4列目、3列目をキーとする ソートをエクセルで、実行するなら
3列目をソート後、(2,1,4)列目をソートします。
この方法なら何列でもソート可能です。

私の環境では、データ数が27万件もあるので、エクセルでは処理不能なのでプログラム化しています。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#34 投稿記事 by イグトランス »

大変お待たせいたしました。これでどうでしょうか。
全体的に修正しているので、ほぼ全てのコードを載せてあります。長々としていて申し訳ありません。
キー列の指定はKeyRowsの配列で行っています。

入力文字列を順に走査していけるよう、それをCreateKeyIndexに渡し、ソートされたインデックスを作っています。
そして各行毎にCreateKey関数でKeyを生成しています。CreateKeyの中で呼んでいるGetKeyRows関数がカンマ毎に文字列を走査してキー列なら取り出すという操作をしています。

問題は肝心のソート処理より時間がかかってしまうことです。別アプローチをとるべきなのかもしれません。

更にクイックソートも私のより河川屋さんやマティさんがより速いコードを載せていたのも気になります。

H17.11.26
コードが長いのでhideを使用するように修正いたしました。
最後に編集したユーザー イグトランス [ 2005年11月26日(土) 14:34 ], 累計 2 回
マティ
記事: 161
登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
連絡する:

#35 投稿記事 by マティ »

自分も、パラメータ指定によるソートを作成しましたので、報告します!
全機能で276ラインありますので、ソースの公開はホームページで行いたいと思います。

呼び出し例(パラメータの渡し方はイグトランスさんを参考にしました)
列番号に正の数を指定すると、数値(整数)としてソート、負の数を指定すると、文字列としてソート

コード: 全て選択


Dim KeyRows[2]=[-4,2] As Char
SortKeys( 2, KeyRows )                            'キー指定
CSVSort("c:\csv\infile.csv","c:\csv\outfile.txt") 'ソート実行
列指定方法がよかったかな?
ここまでは、実装しましたが・・・
昇順/降順の対応はどうしようかな・・・パラメータ指定方法の問題もあるし・・・
最後に編集したユーザー マティ [ 2005年9月23日(金) 15:39 ], 累計 1 回
Zgock

#36 投稿記事 by Zgock »

今回のテストデータのように、「桁数固定」の場合、
ラディックスソートも有効な気がしますね。
ちょっとコード起こしてみます。
(ActiveBasic触ったことないので、これから触って見ますね(汗
マティ
記事: 161
登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
連絡する:

#37 投稿記事 by マティ »

ヒープソートとクイックソートの動作状況を解説してみましたが、あっているでしょうか?
ヒープ
クイック
アドバイスお願いします。
omasu
記事: 96
登録日時: 2005年9月02日(金) 22:15
連絡する:

ありがとうございます。

#38 投稿記事 by omasu »

イグトランスさん、マティさん、早速の対応ありがとうございます。

<CSVファイルのキーを1列目と2列目とする前提条件を
< もし、仮に2列目、1列目、4列目、3列目をキーとする
<  条件にした場合、どのようなコーディングをすればよいかを教えてください。

使用状況のご報告は今しばらく、お待ちください。

フォーラムのテーマについて

 ①.マティさんのヒープとクイックの動作状況ですが、これから本格的に勉強していきたいと思います。
 ②.Zgockさんのラディックスソートに大変興味があります。
 ③.淡幻星さん、もし時間が出来ましたら、最速ロジックの提供をお願いします。
 ④.マティさんのホームページに載っていた、ソートロジックをすべて実行をしてみたいです。(でもまだ実力不足です)

中間結果報告Ⅱについて
前回、報告したアクティブベーシックが最新版と思っていたら、もう4.10が
出ていました。早速ダウンロード、しかし、実行速度に違いがあるような?。

自分も試行錯誤により、いろいろなロジックを組んでいました。 追伸1:
 ①.一番遅いはずの、バブルの進化がクイックソート?。
 ②.シェルソートは、選択法で作ると遅い、挿入法だとなぜか早い。
 ③.単純挿入法はバイナリサーチで挿入ポイントを決めると早い。
 ④.50万件のソートは毎回、PCがフリーズする(メモリ不足)

追伸2:
 ①.基本的なソートやシェルソート(挿入法)の作成で夢中になっていました。
   1000件ソートテストで40mSが出たときは、また失敗しちゃったと思いました。
   テスト結果をみて、また、びっくり、ソートできてる。

 ギャップのとり方は河川屋さんのを「ぱくり」ました。(ギャップの決め方で速度がかなり違う)
 本体はイグトランスさんのを「ぱくり」ました。
 ごめんなさい。m(_ _)m

ホンとかどうかコードを見てください。
他の方もいろんなロジックを教えてください。(~o~)
   「バブルがこんなに遅いはずはない」でも結構です。
最後に編集したユーザー omasu [ 2005年11月06日(日) 15:07 ], 累計 6 回
マティ
記事: 161
登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
連絡する:

#39 投稿記事 by マティ »

omasuさん確認したいことがあります。
ABで、文字列配列を作成すると1000から2000程度で実行不能になりますが、どのように対応しているのでしょうか?
私は、このコミュニティで正常動作するクイックソートの実装方法がわかってからは、クイック派になっています。
あと、バブルソートの進化系はコームソートですよ!

コード: 全て選択


#include "CsvSort3.sbp"          '最新の(ファイル書込を含む)ソートロジック
Dim KeyRows[3]=[-4,2,-3] As char 'ソートキーの指定(列を指定します。+数値列、-文字列)
SortKeys( 2, KeyRows )           '使用するキーの数と、パラメータの配列を渡します。
CSVSort("c:\csv\infile.csv","c:\csv\outfile.txt")  'ソートの実行
ファイルはホームページのCSVソートのLevel3(.sbp)をcsvsort3.sbpとしてご使用ください。
omasu
記事: 96
登録日時: 2005年9月02日(金) 22:15
連絡する:

マティさんに返信

#40 投稿記事 by omasu »

お世話になります。

> ABで、文字列配列を作成すると1000から2000程度で実行不能になりますが、どのように対応しているのでしょうか?

 私は、数万件の文字列定義が可能だったab2.62世代(正確にはN88Basic)ですので、
 ab4.xxになってから、たった1000件の定義で実行不能になるのは解せないと、
アクティブベーシックのバグ報告にも掲載しましたが、今だ解決に至っておりません。

 今回のソートロジック大会で、マティさんやイグトランスさんのソートロジックと同時に、
 ファイル取得方法や、配列へのセット方法も吸収しているところです。

 プロジェクトのテストはマティさんの母体を利用
 ソースレベルでのテストはイグトランスさんの母体を利用させてもらっています。
(了承なしですが)

 各種のソートや、シェルソートでのテストで使った母体はイグトランスさんのものです。
 自分が一番最初に提示した、イントネーション・ディテールを忠実に再現してくれたのもイグトランスさんです。
 いろいろなロジックを組めるのもマティさんや、イグトランスさんのおかげです。

 自分なりに解るように全体のコードを整理した、プログラム全体を提示します。ソートのブロックのみの加工で作成可能です。
(イグトランスさんには了承なしですが)

2005/10/29記述にバグ発見修正しました。AB4.10.02以降
2005/12/17致命的なバグがあります。、利用される方はこちらを
http://www.discoversoft.net/forum/viewt ... =2509#2509
最後に編集したユーザー omasu [ 2005年12月17日(土) 16:28 ], 累計 5 回
omasu
記事: 96
登録日時: 2005年9月02日(金) 22:15
連絡する:

テストデータの掲示についてⅡ

#41 投稿記事 by omasu »

お世話になります。

 前回、テストデータの掲示に失敗したため、テストデータ作成プログラムを起こしました。

 65536件まではエクセルでテストデータを作っていたのですが、
高度なロジックの投稿から10万件、50万件・・・のテストデータが必要となりました。

 愛機の環境では、50万件のソートが限界です、100万件のテストはできません。
 まだ、実行件数や、実行速度に余裕のあるロジックがあることに驚かされます。

ノンメッセージのため、実行中か、終わったのかどうかわかりませんが・・
追伸:注意事項
   50万件のソートは、常駐プログラムを全て終了させ、メモリをクリーニングした後、実行しないと簡単にフリーズします。
   メモリ増設の必要性を感じます。
最後に編集したユーザー omasu [ 2005年11月04日(金) 21:58 ], 累計 1 回
omasu
記事: 96
登録日時: 2005年9月02日(金) 22:15
連絡する:

作成したロジックの掲示について

#42 投稿記事 by omasu »

お世話になります。

自分が試行錯誤により、作成したロジックを提示します。(Swapプロシージャは含みません。)
実行については「2005年09月25日(日)」の「マティさんに返信」のソート部を入替えてください。
もっと早い記述法があるのかもしれません。
コームソートやクイックソートもこれから手がけます

①.バブルソート
②.単純選択法ソート

③.シェーカーソート(バブル)

④.単純挿入法ソート

⑤.単純挿入法ソート(バイナリサーチ)

⑥.シェルソート(挿入法)
最後に編集したユーザー omasu [ 2005年11月04日(金) 22:02 ], 累計 2 回
マティ
記事: 161
登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
連絡する:

#43 投稿記事 by マティ »

9/29:クイックソート部分にバグがあります!修正版は次に投稿します。

性能はたいした事はないのですが、800万件のテストデータ(1.17GB)をソート出来たので報告します。
前提条件
テストデータと同様に、固定長で固定ピッチである事!
ホストコンピュータ又はCOBOLで作成したデータをソートする用途向きの簡略版です。?
教えて
このソートのアルゴリズム名は何って言います?自分で適当に作ったので・・・
マージソートでは無いのは分かるのですが・・・
最後に編集したユーザー マティ [ 2005年12月15日(木) 23:28 ], 累計 2 回
omasu
記事: 96
登録日時: 2005年9月02日(金) 22:15
連絡する:

マティさんに感激

#44 投稿記事 by omasu »

お世話になります。

またまた、新しいロジックの出現に「感謝・感激・雨あられ?」早速実行してみました。(マティさんお酒がすきなんですか?・)

 マティさんに質問なんですが

  Q1.今回の入力テストデータはomasuの作った、テストデータ作成プログラムで800万件を作成したのでしょうか?。

  Q2.とりあえず、infile1000.csvとinfile500000.csvをテストしてみましたが、どうもうまく機能しません。

  Q3.何か、プログラム内に変更するべき、項目があるのでしょうか。

追伸:
 私も大型汎用(パラレル)コンピューターを使用していました。
 使っていたランゲージはコボルです。
 汎用ホストではプログラムでロジックを組まなくても、数百万件のソートは、JCLの¥SORT機能でソート可能です。
 JCLとは(ジョブコントロールランゲージ、DOSでいうパッチ、機能は比較にならず言語クラスですが)
 ユーティリティーだけで高度なソートが可能です。
 しかも、本体スピードが驚異的なものなので、ロジックで組んだとしてもその良し悪しは数秒の差であまり気にしていませんでした。
 しかし、PCではそうもいきません、このような800万件数をソート可能としたロジックに感銘を受けます。

追伸その2:
 ①.汎用ホストでは大容量(数百万件)の入力ファイルを索引編成(INDEX)ファイルにデータを追加して行き、
   使用する際、順読み出し(ソート済み)または乱読み出しを行う手段があります。
   (これは、PCでも使用できると思います。DISK容量の限界あり)
 ②.VSASというとんでもないファイルを使用する方法もあります。
最後に編集したユーザー omasu [ 2005年10月05日(水) 21:51 ], 累計 1 回
Zgock

ラディックスソート(と言い訳)

#45 投稿記事 by Zgock »

すいません、ちょっと時間とれずにサンプル作れなくて申し訳ないです。

なので、ラディックス(基数)ソートの概念だけ説明しますね。
いわゆるバケツソートの変形になります。

バケツソートは、高速ですが、大量のワークを必要とするのが難点です。
たとえばデータ範囲が0~9999であるなら10000のワークが必要ですよね?

ここで、
「データの下2桁と上2桁に着目して、まず下2桁でバケツソート、
続いて上2桁でバケツソートすればワークは100で済むよね?」
という発想が基本です。
2回に分割する場合、バケツソートに比べて速度は2倍、ワークは100分の1になるわけです。

↓こちらのページが参考になるかと思います。
(ヒープソートの説明あたり、かなりわかりやすい部類だと思います)
http://www.ics.kagoshima-u.ac.jp/~fuchi ... m/top.html

クイックソートは速いアルゴリズムで非常に美しいですが、
安定じゃないのだけが欠点ですね。
そういう理由からヒープソートをよく使います。
返信する