【问题标题】:Sorting criteria for ordering this words?排序这个词的排序标准?
【发布时间】:2014-08-18 23:00:14
【问题描述】:

我想做两种排序,第一种如下:

给定一组不同的行,其中两个单词用空格隔开,以使下一行的第一个单词等于前一行的最后一个单词的方式对它们进行排序。例如:

  • 帕梅拉·路易莎
  • 路易斯安吉尔
  • 佩德罗·路易斯
  • 路易莎·埃兰尼
  • 天使佩德罗
  • 埃利安尼·帕梅拉

应该给出类似的东西:

  • 路易莎·埃兰尼
  • 埃利安尼·帕梅拉
  • 帕梅拉·路易莎
  • 佩德罗·路易斯
  • 路易斯安吉尔
  • 天使佩德罗

我将每一行读取为一个字符串,将其放入一个向量中并使用如下的排序比较函数:

bool cmp(std::string a, std::string b)
{
    std::string prb = a.substr(a.find(" ")+1),
                prb2 = b.substr(0, b.find(" "));

    return prb == prb2;
}

但是为了得到想要的结果,我必须排序两次。我不明白为什么会发生这种情况。

第二个排序标准是:

给定一组单词的顺序,使得下一个单词的首字母与前一个单词的最后一个字母相同。例如:

  • EO
  • UIU
  • 爱欧

应该给出类似的东西:

  • 爱欧
  • UIU
  • EO

我做了类似的事情,但似乎不能正常工作。

bool cmp(std::string a, std::string b)
{
    if(b[b.size()-1] == a[0] && a[0] != b[0]) return false;
    return b[b.size()-1] == a[0];
}

我怎样才能使这两种排序正常工作?

【问题讨论】:

  • 你需要向你的老师请教一下,因为我不知道他在问什么。
  • 预期的确切结果是什么?
  • 这不是作业。我就是想不通。你不明白哪些部分? @remyabel 我举了一些例子,你能指出什么是错的吗?
  • 您是否将此函数传递给std::sort?因为那(或任何其他通用排序算法)不是这种“排序”的合适工具。 std::sort 需要能够查看范围内的 any 两个元素,并确定是否以及哪个先出现。
  • @IgorTandetnik:#1 是(或至少可以被视为)一个排序问题——具体来说,拓扑排序,尽管如此,拓扑排序也能找到循环(和如果找到,则失败)。

标签: c++ string sorting


【解决方案1】:

首先,问题#2 可以简化为问题#1。将每个字符串替换为由第一个字母和最后一个字母组成的字符串,用空格分隔;例如AEIOU 变为 A U。那么很明显,在这些新字符串上解决问题 #1 也将在原始字符串上解决问题 #2。

其次,这是一个在有向图中找到Hamiltonian path 的问题。有问题的图由作为顶点的输入字符串组成,在X YY Z 形式的每对顶点之间绘制一条边。

如前所述,问题未充分说明:当图形不包含哈密顿路径时,不清楚什么被认为是正确答案。您的示例有Pamela Luisa 后跟Pedro Luis,这不满足要求。一种可能的解释是找到minimum path cover

【讨论】:

    【解决方案2】:

    可能有比这更好的方法,但我会先检查所有单词并将它们分配为数字 0 到 n。
    然后每一行都可以表示为一对有序的数字。
    然后,如果有 k 行,则创建一个 (k x k) 布尔矩阵。
    如果该列对中的第二个单词与该行对中的第一个单词匹配,则在每个位置中输入 true,否则为 false。
    此时,您应该能够实现一个简单的回溯搜索来找到一些行序列 (x_0, x_1,...),使得所有 i 的 matrix[x_i][x_{i+1}] = true。
    希望对您有所帮助。
    如果你能解决第一个问题,第二个应该很相似。

    【讨论】:

    • 换句话说,构建一个代表输入图的adjacency matrix,然后在该图中找到一个Hamiltonian path。后者比前者难得多——确切地说是 NP-hard。
    • @IgorTandetnik 准确地说,但我认为我应该准确描述其中涉及的内容。感谢您贡献数学方面。
    • 在我的辩护中,我并没有说简单的回溯搜索会快速。如果有人想挑剔我的说法,即可能有更好的方法来解决 NP 难题,取决于他给出的约束,可能会有一些巧妙的技巧来简化问题。还有一些动态编程方法通常比简单的搜索表现更好。
    猜你喜欢
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 2012-03-22
    相关资源
    最近更新 更多