“就地”是啥意思?

Posted

技术标签:

【中文标题】“就地”是啥意思?【英文标题】:What does "in-place" mean?“就地”是什么意思? 【发布时间】:2011-02-16 07:29:33 【问题描述】:

反转字符串中的单词(单词是 用一个或多个空格隔开)。现在 就地完成。

就地是什么意思?

【问题讨论】:

查看此线程以获取有关如何在 C/C++ 中执行此操作的提示:***.com/questions/198199/… @Banang:虽然这是在回答一个不同的问题(反转字符串,而不是字符串中的单词,例如“狗咬人”变成“人咬狗”而不是“南塞提布神” ) ***.com/questions/16585507/sorting-in-place 可以解释一下。 【参考方案1】:

就地算法本质上只能使用O(1) 额外空间。数组反转(本质上是面试问题归结为)是一个典型的例子。以下摘自***:

假设我们想要反转一个包含 n 项的数组。一种简单的方法是:

function reverse(a[0..n])
    allocate b[0..n]
    for i from 0 to n
       b[n - i] = a[i]
    return b

不幸的是,这需要O(n) 额外的空间来创建数组b,并且分配通常是一个缓慢的操作。如果我们不再需要a,我们可以使用这个就地算法用它自己的反转覆盖它:

function reverse-in-place(a[0..n])
    for i from 0 to floor(n/2)
       swap(a[i], a[n-i])

有时在原地做某事是非常困难的。一个经典的例子是一般的非方阵转置。

另见

In-place algorithm In-place matrix transposition

【讨论】:

非方阵转置甚至可以就地进行吗?当然,它需要在每一侧都有不同的尺寸。 2x3 数组变成 3x2 数组? @penguat:矩阵将存储在 6 个元素的一维数组中。换位从行优先切换到列优先,反之亦然,例如ABCDEFADBECF. 啊。是的,我现在看到了就地转置是多么棘手,并且在实施之前需要大量思考。【参考方案2】:

您应该将原始字符串的内容更改为相反的内容,而不使用临时存储变量来保存字符串。

【讨论】:

这不可能吗?你至少需要一个循环计数器或指针,可能是 2 个。 嗯,我的意思是一个存储变量来保存临时值。根据语言,您确实需要计数器或指针。 Charles 指的是保存“字符串”的临时存储,而不是计数器或指针。@SimonNickerson【参考方案3】:

就地意味着您应该更新原始字符串而不是创建新字符串。

根据您使用的语言/框架,这可能是不可能的。 (例如,字符串在 .NET 和 Java 中是不可变的,因此如果不采取一些邪恶的技巧,就不可能对字符串执行就地更新。)

【讨论】:

对于 .NET 或 Java,可以将问题改写为讨论字符数组或 StringBuilder

以上是关于“就地”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

请问C语言中strcpy函数,dst和src不能重叠是啥意思?

PPPoE是啥意思,PPPoE是啥意思

“?”是啥意思?在 Erlang 中是啥意思? [复制]

Quicksort与就地合并排序

“this”这个词是啥意思,“static”是啥意思?

“||”是啥意思在 var 语句中是啥意思? [复制]