【问题标题】:Constant time string reversal with smart strings?使用智能字符串进行恒定时间字符串反转?
【发布时间】:2015-06-01 20:30:45
【问题描述】:

在 C 中,不是只跟踪字符串的长度,如果我们也跟踪它的方向呢?例如,如果str = "hello" 被布置在内存中(由 malloc 给出),我们会说它有一个正方向 (+1),因此将 +1 传递给函数参数。我们现在可以说rev = str[size - 1] 方向为-1,而不是用 O(n) 来反转这个字符串,因此它的处理方式不同。我意识到空终止可能会带来一些问题,但鉴于我们在内存中有字符串长度和起始字符,我们不需要关心空终止(如果我错了,请纠正我)。

如果字符串反转在程序中至关重要,这是一个可行的选择吗?有人可以给我一个为什么我不应该这样做的理由吗?有人听过或看过吗?

抱歉,如果我的格式关闭,这是我第一次发帖。提前致谢!

【问题讨论】:

  • 不管你的方向标志是什么,任何库函数都可能会向前迭代字符串。
  • 确实如此。在使用其他约定时,我确信不建议这样做,但如果从头开始构建某些东西,它可能是一个有趣的基础,不是吗?
  • 有可能实现它,但你必须自己做。这是一个非常罕见的需求(反转字符串),因此您的解决方案(可行)不会在您的程序之外大量使用。
  • 作为一个真正的好奇心,学术界之外的任务将字符串反转作为“程序中的关键”。
  • O(1) 中完成刺痛反转的唯一方法是将其也反向存储。

标签: c string reverse


【解决方案1】:

我很确定,为了反转字符串,您将不得不以某种方式复制字符串。在某种 MMU 技巧之外,系统的内存读取在寻址级别被反转,这需要至少遍历字符串一次。即使一次复制 4/8/16+ 个字节,这仍然是线性操作。

现在,如果您可以反向读取字符串(使用特殊的迭代器或其他东西),那么也许您可以认为这是一个 O(1) 操作,前提是这个特殊的迭代器也是 O(1) .

【讨论】:

    猜你喜欢
    • 2010-12-24
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多