【发布时间】:2014-11-16 01:24:30
【问题描述】:
以下代码是用于搜索数组中元素的最大出现次数的算法。此解决方案假定元素的范围为 0 到 n-1。
void MaxRepetitions( int A[], int n ) {
int i=0; max=0, maxIndex;
for(i=0, i<n, i++)
A[A[i]%n] +=n;
for( i=0, i<n, i++)
if (A[i]/n > max) {
max = A[i]/n;
maxIndex=i;
}
return maxIndex;
}
A[A[i]%n] +=n; 是如何扩展的?
A[A[i]%n] = A[A[i]%n] + n 正确吗?
--
编辑
例如 A = [2, 4, 7, 5, 4, 11],其中 n=6
A[0]%n = 2
A[1]%n = 4
A[2]%n = 1
A[3]%n = 5
A[4]%n = 4
A[5]%n = 5
在这个循环之后:
for(i=0, i<n, i++)
A[A[i]%n] = A[A[i]%n] + n;
Iteration 1:
A[A[0]%n] = A[A[0]%n] + 6 --> A[2] = A[2] + 6 --> A[2] = 13
The array is now: A = [2, 4, 13, 5, 4, 11]
Iteration 2:
A[A[1]%n] = A[A[1]%n] + 6 --> A[4] = A[4] + 6 --> A[4] = 10
The array is now: A = [2, 4, 13, 5, 10, 11]
Iteration 3:
A[A[2]%n] = A[A[2]%n] + 6 --> A[1] = A[1] + 6 --> A[1] = 10
The array is now: A = [2, 10, 13, 5, 10, 11]
Iteration 4:
A[A[3]%n] = A[A[3]%n] + 6 --> A[5] = A[5] + 6 --> A[5] = 17
The array is now: A = [2, 10, 13, 5, 10, 17]
Iteration 5:
A[4] now is 10
A[A[4]%n] = A[A[4]%n] + 6 --> A[4] = A[4] + 6 --> A[4] = 16
The array is now: A = [2, 10, 13, 5, 16, 17]
Iteration 6:
A[5] now is 17
A[A[5]%n] = A[A[5]%n] + 6 --> A[5] = A[5] + 6 --> A[5] = 23
数组现在是:A = [2, 10, 13, 5, 16, 23]
现在,一旦第二个循环运行,每个元素的 A[i]/n 为:A [0, 1, 2, 0, 2, 3 ]
看起来这个算法会选择 11 作为出现次数最多的元素,这是不正确的。有什么帮助吗?
【问题讨论】:
-
How is A[A[i]%n] +=n; expanded??是的,它是A[A[i]%n] = A[A[i]%n] + n;。 -
好的,我现在有一个后续问题待处理
-
你不是说一个元素的范围是0到n-1(不是n到n-1)吗?如果任何元素为负数或大于 n-1,此代码将无法正常工作。
-
至少
maxIndex = i! -
那么您的问题是
+=运算符是如何工作的?请将您的问题简化为一个最小示例,并正确格式化。