私は C++ の課題を抱えており、選択したコンテナーに関する Knuth 問題の単純な解決策を考案し、生成されたパフォーマンス データを調査する必要があります。以下の問題を参照してください。
異なる名前を持つ 300 万人の男性が、ニューヨークからカリフォルニアに至るまで、端から端まで敷設されました。各参加者には一枚の紙が渡され、その紙に自分の名前と列のすぐ西側にいる人の名前を書き留めました。列の最西端にいた男性は、何をすべきかわからなかったので、紙を捨てました。残りの 2,999,999 枚の紙片は巨大なバスケットに入れられ、ワシントン DC の国立公文書館に運ばれました。ここでバスケットの内容は完全にシャッフルされ、磁気テープに移されました。
この時点で、情報科学者は、元の順序で人々のリストを再構築するのに十分な情報がテープにあることに気付きました。そしてコンピューター科学者は、テープのシーケンシャル アクセスと少量のランダム アクセス メモリのみを使用して、データ テープを 1000 回未満のパスで再構成する方法を発見しました。これはどのように可能でしたか?
[言い換えると、1 ≤ i < N のペア (xi, xi+1) がランダムな順序で与えられ、xi が異なる場合、シーケンス x1 x2….xN をどのように取得し、すべての操作をシリアル手法に制限することができますか? 、磁気テープでの使用に適しています。これは、指定された 2 つのキーのどちらが他のキーよりも先行しているかを簡単に判断できない場合に、順序をソートする際の問題です。
調査の結果、リストや法線マップではなく、unordered_map を使用することにしました。私が理解していないのは、コードとして実装するために提供された単純なソリューションです。
論文が (Name, Name) タプルの集まりであると考えてください。これらのタプルから、後継者 (西側の隣人) と前任者 (東側の隣人) の両方を確立できます。
- identify an individual xc
- append xc to empty list
- while xc has westerly neighbour
- xc < westerly neighbour of xc
- append xc to list
- xc < head of list
- while xc has easterly neighbour
- xc < easterly neighbour of xc
- prepend xc to list
私の最初の質問 - xc はコンテナの性質上順序を決定できないため、単なるランダムな要素ですか?
私の 2 番目の質問 - 私たちが与えられた名前は次のようなファイルにあります:
Hazbgaei,Ckwkkkxa
Hrunmkoc,Usjgmunt
Cmkcwncb,Ycrnwzjl
Oygvmrhf,Hylmukiw
Jursaual,Gzrddsbg
それで、最初の名前を1つのリストに入れ、次に姓を別のリストに入れる必要があるという素朴な解決策はありますか?
私が完全にオフになっている場合は申し訳ありませんが、私はこれを本当に理解しようとしました!