C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.93174 の関連記事表示

<< 0 >>
■93174  自然ソートを高速で行う方法
□投稿者/ NNN -(2019/11/25(Mon) 21:42:23)

    分類:[.NET 全般] 

    自然ソートに関してですが、
    https://wiki.dobon.net/index.php?.NET%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B8%A6%B5%E6%2F111

    ここにコードが掲載されています。
    いくつか方法がありますが、
    StrCmpLogicalWを使用する方法 以外の方法だと
    Explorerのソート順と一致しないことがあるため、
    StrCmpLogicalWを使用する方法 を使っています。

    ただ、ファイル数が多いとかなり時間がかかってしまいます。

    この方法はForループで何度も二つのファイル間で比較を行うわけですが、
    何度もStrCmpLogicalW関数を呼び出すのは時間がかかるため
    最初に全ファイルをDoubleのような変数に変換して、
    後から、順番に比較するようなことをしたいのですが
    そのようなことは可能でしょうか?

    他にもっと高速な方法がありましたらお教えくださいませ。
親記事 /過去ログ161より / 関連記事表示
削除チェック/

■93180  Re[1]: 自然ソートを高速で行う方法
□投稿者/ furu -(2019/11/26(Tue) 09:40:07)
記事No.93174 のレス /過去ログ161より / 関連記事表示
削除チェック/

■93185  Re[2]: 自然ソートを高速で行う方法
□投稿者/ はまぐり -(2019/11/26(Tue) 20:41:58)
    No93174 (NNN さん) に返信
    シュワルツ変換を使ったソートならLINQのOrderByを使えば簡単にできます

    StrCmpLogicalWの実装に従ってソートキーを正規化するのは
    StrCmpLogicalWのソースコードが公開されてれば頑張りようもありますけど
    ブラックボックスなのでどうにもできないような・・・

    目的は高速化で手段としてシュワルツ変換をしようとしておられるわけですよねー
    StrCmpLogicalW関数はそんなに遅いのかなと思って試してみましたけど1億回呼んでも10秒でした、結構速いです
    シュワルツ変換は複数のフィールドでソートするときには効果的ですが今回はあまり効果なさそうな気がします

    気になるほどの時間がかかっているとするなら原因は違うところにあるんじゃないかなと
    ディスクのIOが遅いとか、furuさんの観点は鋭いと思いました

記事No.93174 のレス /過去ログ161より / 関連記事表示
削除チェック/

■93359  Re[3]: 自然ソートを高速で行う方法
□投稿者/ NNN -(2019/12/07(Sat) 12:11:42)
    ありがとうございます。
    返信遅れました
    furuさんの仰る通り、
    バブルソートを使っているのが原因でした

    ちなみに自分でクイックソートプログラムを作って比較してみたのですが、
    以下のように'Array.Sortの方が20%程度速かったのです。


    'バブルソート 7390ミリ秒
    'クイックソート 58ミリ秒
    'Array.Sort 49ミリ秒

    'Array.Sortはシュワルツ変換を使っているのでしょうか?
    あるいは、同じクイックソートだけれど、中はC++のような高速な言語で走っているので
    高速なのでしょうか?
記事No.93174 のレス /過去ログ161より / 関連記事表示
削除チェック/

■93361  Re[4]: 自然ソートを高速で行う方法
□投稿者/ キングダム -(2019/12/07(Sat) 20:42:59)
    No93359 (NNN さん) に返信

    Array.SortはkeySelectorを引数にとらないので
    シュワルツ変換は行われていないはずです

    コンパレータを渡さなければネイティブコードが呼ばれるみたいです
    コンパレータを渡したらマネージコードでソートしてますね(GitHubのソースコード見ました)

    クイックソートの実装が違えば20%くらいの
    差はあるんじゃないかなと思います

    ・ピボットの選び方を工夫する
    ・交換の仕方を工夫する
    ・再帰をループに置き換える
    ・件数が少なかったら挿入ソートに切り替える
    ・再帰が深くなったらヒープソートに切り替える

    クイックソートの実装ではこのような方法があるんでそのあたりの実装の違いで
    20%くらいは差が出るんじゃないかなと思います

    速いソートを実装するならそういった最適化をしつつ
    マルチスレッドで処理するようにするとArray.Sortを超えられると思います
記事No.93174 のレス /過去ログ161より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -