【问题标题】:Insert a String To a Sorted String list without using native c++ functions在不使用本机 C++ 函数的情况下将字符串插入排序字符串列表
【发布时间】:2021-01-12 11:00:23
【问题描述】:

我必须在已经排序的字符串列表中插入一个字符串,实现这一点的最佳方法是找到要插入的确切位置,而不必对所有列表进行排序,也不需要预先添加字符串。我只需要找到要插入的位置。

我确实有一个比较 2 个字符串的函数 compare(first-string , second-string) 如果第一个字符串必须放在第二个字符串之前,这个函数给我 true 以其他方式。预计会用到这个功能。

在我的场景中使用的 List 不是 c++ std::list 而是一个处理列表某些功能的自定义类。

【问题讨论】:

  • 对列表最好的办法就是遍历它并比较每个元素
  • 只需搜索列表,直到找到与插入字符串相比“更高”的第一个元素,并将其放在该元素之前(即前一个元素之后)。
  • 由于我们不知道您是如何制作自定义排序列表的(尽管您可以怀疑一个属性:它可能是“排序的”),因此我们无法回答这个问题。 IE。我们需要确切了解您的列表是如何构建和管理的,以便对如何导航到插入点并执行操作有任何有用的见解。
  • 我认为这更像是一个算法问题,而不是一个编码问题。 OP 不要求代码,而是抽象的“如何”,因此不需要实际的实现和代码来回答这个问题。
  • 这能回答你的问题吗? binary search on a single linked list

标签: c++ list binary-search insertion-sort insertion-order


【解决方案1】:

如果您到达一个停车位,每个停车位都以从 A 到 Z 的字母顺序命名。

然后我告诉你,你可以在字母 P 处停车。

你会怎么找到那个地方?

【讨论】:

  • 恕我直言,停车位是一个向量,而不是一个列表。您不能对列表进行二分搜索,但可以对停车位进行二分搜索。
  • @ThomasSablik 我强烈反对。这仅适用于大型单排停车场。这样的人不多。
  • 虽然“寻找你的车”会是一个更好的例子
  • @AsteroidsWithWings 为什么是单排?您是否曾经将 2D 图像(或 3D 彩色图像)存储在 1D 数组或向量中?你只需要图像的大小。您可以估计大多数停车位的大小。我可以二进制搜索{{1, 2, 3}, {4, 5, 6}, {7, 8, 9]} 并将这些值存储在一维数组或向量{1, 2, 3, 4, 5, 6, 7, 8, 9} 中,大小为{3, 3}
  • @ThomasSablik 好的,我会告诉你——我想我的意思是,德拉克斯关于所有空间都按严格递增顺序(尽管布局)标记的停车场的想法是不寻常的:P Car我知道的公园在这个意义上是相当随意的,所以二进制搜索在现实世界中并不真正起作用。 “哦,131 号空间在那边?然后 140 号从 那个 角开始?好吧..”但我很欣赏这个前提的公理。
【解决方案2】:

您是否应该能够遍历您的列表,并对每个项目进行比较,您可以根据每个字符串彼此之间的接近程度对每个字符串进行评分。假设你有一个这样的字符串列表:["aa", "ab", "bc", "cc"] 并且你想插入 "bb"。 “bb”与“aa”有多相似,答案是 0。下一次迭代。 "bb" 与 "ab" 的相似程度: 1. 现在我们增加了 1。标记位置并继续循环。 “bb”与“bc”有多相似: 1. 下一个循环。 "bb" 与 cc: 0 的相似程度。所以当我们得到一个减少的时候,我们现在知道应该放置 "bb" 的位置已经过去了。这意味着我们可以返回并进行更彻底的搜索。

这是一个完整的功能:

    void InsertAZ(list<string>& strings, string&& str) {
        std::list<string>::iterator it;
        it = strings.begin();
        for (auto s : strings) {
            if ((s > str) == 1) {
                strings.insert(it, str);
                break;
            }
            ++it;
        }
    }

    int main()
    {
        list<string> strings = { "aaa", "aab", "aac", "aba", "abb", "abc", "aca", "acb", "acc", "baa", "bab", "bac", "bba", "bbb", "bbc", "bca", "bcb", "bcc", "caa", "cab", "cac", "cba", "cbb", "cbc", "cca", "ccb", "ccc" };

        InsertAZ(strings, "bab");

        cin.get();
    }

【讨论】:

  • 字符串通常按lexicographic order排序。您应该停在"bc" 并在"bc" 之前插入"bb"。 OP 说列表已经排序。相似性有何帮助?请描述“返回并更彻底地搜索”
  • 这是 C++。为什么要使用带有 C 字符串的 strcmp 而不是 compare operators
  • 我是 c++ 和 c 的新手。 strcmp 和 strcoll 是我遇到的两个函数,我发现它们很有帮助。据我所知,我的解决方案是有效的。我将阅读有关字符串强硬的比较运算符。
  • 请不要建议将字符串不必要地转换为 C 字符串以便能够使用 C 函数。您可以将字符串与s &lt; strs &lt;= strs == str、...进行比较,而您的InsertAZ 函数甚至不会在列表中插入任何内容。返回第一个参数的未更改副本是没有意义的。
猜你喜欢
  • 2015-07-18
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
  • 2015-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多