【问题标题】:C++ sorting algorithmC++ 排序算法
【发布时间】:2013-01-12 12:30:17
【问题描述】:

感谢您提前查看此问题。

我正在尝试订购以下物品清单:

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. 使用对的第二个名称,找到用作第一个名称的对
  3. 将该对的第二个名称添加到列表中
  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”是否正确,因为我只插入了第一个值。

我的问题是有人能给我一些关于如何解决这个问题的见解吗?因为我不确定最好的方法以及我的想法是否正确。任何见解将不胜感激。

【问题讨论】:

  • 从纽约到加利福尼亚的三百万名不同名字的男子首尾相连。每个参与者都得到一张纸条,他在纸条上写下自己的名字和排在他西边的人的名字。队伍最西端的那个人不知道该怎么办,所以他把报纸扔了。剩下的 2,999,999 张纸条被放入一个巨大的篮子中,并被带到华盛顿特区的国家档案馆。篮子里的东西在这里被完全打乱并转移到磁带上。 unordered_map 正在洗牌。
  • 您是否要对unordered_map进行排序???
  • 是否需要重新生成 2,999,999 个名称的顺序?排序是一个坏名字,但我想我理解
  • 关于标签:为什么是“knuth”?
  • IMO,认为这是排序是错误的。您真正拥有的是“关系链表”——即链表,但不是每个节点都包含指向下一个节点的指针,而是指针字段包含下一个节点的值。或者,您可以将其视为(某种)拓扑排序。

标签: c++ algorithm sorting unordered-map knuth


【解决方案1】:

你的计划只有一个弱点。你需要首先找到连锁店的第一人,纽约先生。

您的算法假设该行从第一个人开始。为此,您应该首先扫描整个地图以找到不作为第二个元素出现的一个名称。那是纽约先生,你可以从那里开始。 push_back 是您需要在这里使用的。

【讨论】:

  • 现在编辑了评论,但是是的,我做错了!好吧,这已经说明了一些情况..
  • 是的,就是这样。所以一次扫描找到第一个,第二次生成列表
  • 你是说“Xocbwmnd”应该是第一个,然后从他的第二个名字,从那里搜索。所以这就是为什么我的排序列表比它应该的要短..
  • @lauw0203 是的,正是我的意思。
  • 我刚刚和其他也在做这件事的人谈过,他们说因为你要去东西方,所以所有的值都会累积到列表中,所以你可以从开始。
【解决方案2】:
  1. 创建一个数据结构来存储一个链,它的正面和背面。以“back”为键存储在哈希表中。
  2. 创建一堆单例链(每个元素一个)
  3. 反复选择一个链,在哈希表中找到它的“前”(即找到与“后”具有相同元素的另一个链)并将它们合并
  4. 做到这一点,直到你只剩下一条链

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-08
    • 2018-05-17
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多