我有一个 C++ 任务,我必须用我选择的容器设计一个简单的 Knuth 问题解决方案,并研究生成的性能数据。请参阅下面的问题:
从纽约到加利福尼亚,三百万名不同的人被端对端放置。每个参与者都得到一张纸条,他在纸条上写下自己的名字和排在他西边的人的名字。队伍最西端的那个人不知道该怎么办,所以他把纸扔了;剩下的 2,999,999 张纸条被放在一个巨大的篮子里,并被带到华盛顿特区的国家档案馆。篮子里的东西被完全打乱并转移到磁带上。
此时,一位信息科学家观察到磁带上有足够的信息可以按照原始顺序重建人员列表。一位计算机科学家发现了一种方法,可以通过少于 1000 次的数据磁带进行重建,只使用磁带的顺序访问和少量的随机存取存储器。这怎么可能?
[换句话说,给定 1 ≤ i < N 的对 (xi, xi+1),以随机顺序,其中 xi 不同,如何获得序列 x1 x2….xN,将所有操作限制为串行技术,适用于磁带上。当没有简单的方法来判断两个给定键中的哪一个在另一个之前时,这就是排序问题。
根据我的研究,我决定使用 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 只是一个随机元素,因为容器的性质无法确定顺序吗?
我的第二个问题 - 我们得到的名字在一个文件中,如下所示:
Hazbgaei,Ckwkkkxa
Hrunmkoc,Usjgmunt
Cmkcwncb,Ycrnwzjl
Oygvmrhf,Hylmukiw
Jursaual,Gzrddsbg
那么天真的解决方案是说我应该取名字并将其放入一个列表中,然后将姓氏放入另一个列表中吗?
抱歉,如果我完全离开,但我真的试图理解这一点!