現在Solaris上で作られたソフトウェアをwindowsに乗せ換えるポーティング作業を
行っているのですが、qsortの結果が一致せずに困っています。
比較関数で判定できる範囲は一致するのですが、比較関数が一致するデータ同士の順番が
一致せず、その結果出力される生成物の内容が異なってしまいます。
(同じ生成物が作成されなければポーティング作業完了と成りません)
多分qsortのアルゴリズムの違いだと思うのですが、Solarisのqsortのアルゴリズムがわかる方
いらっしゃいませんか?
Solarisのコンパイラは以下の通り
Sun WorkShop Compiler Csparc 5.0
出来ればqsortのソースコードが有ればよいのですが、軸要素の決定方法だけでも解れば
幸いです。
いくつか、公開されているアルゴリズムを試してみたのですが、一致する物は有りませんでした。
(Windowsのソート結果とも違いました)
因みに、Windowsの開発環境は、
Microsoft Visual Studio 10.0
です。
A 回答 (7件)
- 最新から表示
- 回答順に表示
No.7
- 回答日時:
No.6
- 回答日時:
> 新システムと旧システムでグループ内に新旧で同じレコードが
> グループ化されていないのが問題と成っています。
これがどういった意味で問題となっているのでしょうか?
新・旧システムが連携する必要が有るのでしょうか?
それともポーティングの検証として突合せを行なうためでしょうか?
> お客様に問題の比較関数にキーを追加して旧システムの再構築を行って・・・
という案が出るくらいですから、既存のデータとの一貫性では無いと思いますが。
比較関数が一致するデータ同士の順番については、元のSolaris版でも「キー列の値もデータ数も順番も同じ入力に対しては同じソート結果になる」以上のことは前提としていないはずですので、Windows版で使用するソート関数に同様の前提が成り立つことが確認できれば大丈夫な気もするのですが・・・。
まあ、作業量的に可能ならば、お話の様に比較関数にキーを追加する方が良いとは思います。
ちなみにピボットをデータ列からランダムに選ぶやり方も有るので、「キー列の値もデータ数も順番も同じ入力に対しては同じソート結果になる」という前提の成り立たない QuickSort 実装も有りえます。
No.5
- 回答日時:
安定ソートでないqsortを使う限り同等なデータのソート順序
は不定になります。
>データを追加して実施した所関係の無い所まで順番が変わって
>しまいました。
>データを削除したら元に戻りました。
旧システムも今まで気づかれていなかっただけで、同様な結果に
なると思われます。
これを固定化しようとするのであれば、旧システムと出力順が
変わってしまいますが、連番(読み込み順)や作成日時等の項目を
ソートキーとして追加する等の手段をとる必要があります。
出力順が異なる件に関しては、No.3の回答にあるように条件交渉
してみてはどうでしょうか?
>例えば、下記の様なものも作業完了の条件として考えられるのではないでしょうか?
>・Solaris版で出力された全データがWindows版でも過不足無く出力されている事
>・(比較関数の)仕様に従ってソートされている事
この回答への補足
>同等なデータのソート順序は不定になります。
ソート前の順番にならないだけで、ソートアルゴリズムに則った順番に並びます。
現在、お客様に問題の比較関数にキーを追加して旧システムの再構築を行ってもらい、
同じ修正を新システムに施し、出力結果が一致することによりポーティングOKと
しようと言う話に成ってきています。
但し、水平展開として、同じような箇所が無いか調査し、同等な処置を施さなければ
成りません。
ソート対象と成るメモリテーブルは100以上有り、qsort関数の使用箇所は、数百有ります。
そのすべてを調査し、曖昧な比較関数が有れば、ユニークに成る様にキーを追加し、
ソート順を固定化する事による影響を調査し、お客様に、修正依頼をだして再構築して
もらい、出力結果の一致確認を行なう。
気が狂いそうです。
旧システムのqsort関数のソースコードが有れば、又、軸要素の決定方法が解れば
ユーザ関数としてsort関数を作成し、システム上のqsort関数の使用箇所を、一括置換で
ユーザー関数に置き換えて再構築し、最終出力結果の一致確認だけで良いので
何とか成らないかと、探している状況です。
No.4
- 回答日時:
qsortアルゴリズムの違いよりは、ソート対象のデータ型の違いか、データの文字コードの違い(UTF16LE(またはSJIS)、EUC)、CPUレベルでのバイト順(Big Endian, Little Endian)の違いの方が疑わしいと思います。
アルゴリズムの違いを疑うのであれば、アセンブラコードをデバッガを使ってトレースすればはっきりするでしょう。
この回答への補足
文字コードの違いやEndianの問題はデータの移行時に変換されています。
またソート対象キーは数値フィールドなので文字コードは関係ありませんし、
キー単位でのソートは出来ています。
キーが同じレコードの順番が新旧システムで違うので、qsortアルゴリズムの違いと断定
しました。
旧システムは、旧システムはお客様が業務で使用しているので、デバッガでトレース
なんて荒業は行うことは出来ません。
No.3
- 回答日時:
直接的な回答ではなく恐縮ですが・・・。
問題の本質は作業完了の条件が不適切だったいうことでは無いでしょうか。
比較関数が一致するデータ同士の順番は、仕様としては特に意味が無いわけですよね?
であるならば、依頼者側に作業完了の条件を修正してもらう様に交渉してはいかがでしょうか?
契約の内容の見直しも考える事になるのかも知れませんが、解決できるかどうかも分らなく、かつ本質的に不要な作業に無駄な工数を掛けるよりも建設的かと。
例えば、下記の様なものも作業完了の条件として考えられるのではないでしょうか?
・Solaris版で出力された全データがWindows版でも過不足無く出力されている事
・(比較関数の)仕様に従ってソートされている事
この回答への補足
>比較関数が一致するデータ同士の順番は、仕様としては特に意味が無いわけですよね?
どうも、データ作成時に特定のキーでソートし同一キー内で連番を付加し(この番号が、
新旧で順番が異なる)、その後別の複数のキーでソートし(此方はキーにてユニークに
成るので新旧で同じになる)データをメモリテーブルに登録されます。
その後別のプログラムで付加された番号単位でレコードをグループ化し、
(1番目のグループ、2番目のグループ、3番目の・・・)グループ単位で
処理を行っている様なのですが。
新システムと旧システムでグループ内に新旧で同じレコードがグループ化されていない
のが問題と成っています。(グループ内が同じレコードでグルーピングされていれば順番、
グループ番号が一致しなくても問題ないのですが。)
No.2
- 回答日時:
>同じデータを読ませる限り同じ結果になる事は確認済みです。
同等なデータのソート前の順序は、ソート後も同じですか?
または、データ1件追加した時に順番がどうなりますか?
この回答への補足
>同等なデータのソート前の順序は、ソート後も同じですか?
それは新システムも旧システムもソート前と変わっています。
但し新システムと旧システムでは順序が違うのが問題です。
>データ1件追加した時に順番がどうなりますか?
旧システムはお客様が業務で使用しているのでデータの追加は出来ません。
新システムは元データに無理やりデータを追加して実施した所関係の無い所まで
順番が変わってしまいました。
データを削除したら元に戻りました。
No.1
- 回答日時:
qsort(クイックソート)は、安定ソートではありません。
※(あんていソート、stable sort)ソート(並び替え)の
アルゴリズムのうち、同等なデータのソート前の順序が、
ソート後も保存されるもの。
従って、同等なデータがある場合のソート順は不定となります。
Solaris上で作られたソフトウェアで作成されたデータが毎回
同じ結果になるかは、確認してみましたか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 法学 S53,3,22 刑法判例について 被害者を熊と間違って猟銃を発射 2 2023/06/19 16:10
- 計算機科学 これは迷路を解くというよりも、いかに速く最速で走り切れる経路を見出せるかや、マシン性能、プログラミン 3 2023/07/17 16:27
- Java Java 南京錠 2 2023/02/04 11:46
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- Windows 10 windows10のクリーンインストールが完了出来ない 2 2022/06/04 13:33
- Excel(エクセル) エクセルで2つの表を比較して、文字列が同じだが、その行のある値が違うものを抽出したい 1 2022/10/06 21:48
- C言語・C++・C# C言語 3 2022/10/04 15:07
- Visual Basic(VBA) フレームワーク「4.8.1」で、[Sub Main]が動かない。助けて下さい 3 2022/11/14 15:40
- IT・エンジニアリング 不具合の現状認識をしないプログラマって信用できる人? できない人? 8 2023/07/28 09:09
- Excel(エクセル) 【詳しい方教えて下さい】EXCEL条件に一致する値の複数抽出 9 2022/04/29 10:56
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「データをプロットする」の意...
-
チラシやPOPの元データは無償で...
-
営業秘密とは、どこからのこと...
-
大学の科研費について
-
CRC:巡回冗長検査で
-
身の回りの困り事を解決する課...
-
RAWデータを請求する根拠
-
Macmini 14.1.2 ログイン画面に...
-
海外とのやり取り(英語)に関す...
-
マクドナルドの客層データーなど
-
【弥生会計】会計期間の変更方...
-
会計王9で2台のPCでデータを...
-
Macのデータバックアップしたい...
-
Excel のサンプルデータ、事例...
-
弥生会計クラウド24と、freeeど...
-
「訂正」と「修正」の違いはな...
-
エクセルの計算式を教えて下さい
-
弥生会計04 補助科目のインポ...
-
ID Manager ログインできない!!
-
弥生会計プロ06の棚卸資産の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
データベース関係で、データの...
-
「データをプロットする」の意...
-
大学の科研費について
-
編集用語「実データ」とは?
-
営業秘密とは、どこからのこと...
-
ネガデータって何?
-
身の回りの困り事を解決する課...
-
海外とのやり取り(英語)に関す...
-
ExcelのSUMIFS関数について色々...
-
農林水産省の食糧需給表につい...
-
EEPROMのデータが壊れる。
-
勘定奉行をつかって前年対比が...
-
給与奉行のデータをエクセルに...
-
弥生会計のデータを
-
情報処理の問題で、これがよく...
-
access 登録したデータを修正...
-
TKC会計 FX2について
-
オープンアドレス法の欠点
-
Excel 2007 グラフのデータテ...
-
弥生会計proで内訳書を印刷する...
おすすめ情報