2

事前にこの質問をご覧いただきありがとうございます。

次のアイテムのリストを注文しようとしています。

Bpgvjdfj,Bvfbyfzc
Zjmvxouu,Fsmotsaa
Xocbwmnd,Fcdlnmhb
Fsmotsaa,Zexyegma
Bvfbyfzc,Qkignteu
Uysmwjdb,Wzujllbk
Fwhbryyz,Byoifnrp
Klqljfrk,Bpgvjdfj
Qkignteu,Wgqtalnh
Wgqtalnh,Coyuhnbx
Sgtgyldw,Fwhbryyz
Coyuhnbx,Zjmvxouu
Zvjxfwkx,Sgtgyldw
Czeagvnj,Uysmwjdb
Oljgjisa,Dffkuztu
Zexyegma,Zvjxfwkx
Fcdlnmhb,Klqljfrk
Wzujllbk,Oljgjisa
Byoifnrp,Czeagvnj

次の順序に:

Bpgvjdfj
Bvfbyfzc
Qkignteu
Wgqtalnh
Coyuhnbx
Zjmvxouu
Fsmotsaa
Zexyegma
Zvjxfwkx
Sgtgyldw
Fwhbryyz
Byoifnrp
Czeagvnj
Uysmwjdb
Wzujllbk
Oljgjisa
Dffkuztu

これは次の方法で行われます。

  1. 最初のペアを取り、名前をリストに入れる
  2. ペアの2番目の名前を使用して、それが1番目の名前として使用されているペアを見つけます
  3. そのペアの2番目の名前をリストに追加します
  4. 2と3を繰り返す

unordered_mapにペアを入力してから、各名前を並べ替えてリストに追加しています。これは、次のコードで確認できます。

westIter = westMap.begin();
std::string westCurrent = westIter->second;
westList.push_front(westCurrent);

for(int i = 0; i < 30; i++)
{
    if(westMap.find(westCurrent) != westMap.end())
    {
        //find pair in map where first iterator is equal to "westCurrent"
        //append second iterator of pair to list
    }
    westIter++;
}

注:最初の値しか挿入されていないため、現時点で「push_front」が正しいかどうかはわかりません。

私の質問は、誰かが私がこれについてどうやって行くことができるかについて私にいくつかの洞察を与えることができるかということです。私は最善の方法と私の考えが正しいかどうかわからないので。任意の洞察をいただければ幸いです。

4

2 に答える 2

2

あなたの計画にはただ1つの弱点があります。まず、チェーンの最初の人物であるニューヨーク氏を見つける必要があります。

あなたのアルゴリズムは、ラインが最初の男から始まることを前提としています。これを機能させるには、最初にマップ全体をスキャンして、2番目の要素として表示されない1つの名前を見つける必要があります。それがニューヨークさんで、そこから先に進むことができます。push_backここで使用する必要があるものです。

于 2013-01-29T02:07:29.977 に答える
1
  1. チェーンとその前面と背面を格納するデータ構造を作成します。'back'をキーとしてハッシュテーブルに格納します。
  2. シングルトンチェーンの束を作成します(要素ごとに1つ)
  3. 繰り返し、チェーンを選択してハッシュテーブルでその「フロント」を見つけ(つまり、「バック」と同じ要素を持つ別のチェーンを見つけます)、それらをマージします
  4. チェーンが1つだけになるまでそれを行います
于 2013-01-29T03:06:12.933 に答える