【发布时间】:2018-07-12 23:24:41
【问题描述】:
一个数组a[],有N个元素,允许重复,如果超过一半的内容等于v,则称其“主要包含av元素”。给定数组a[],它旨在绘制一个有效的算法(在时间 N.log (N) 并使用分治法)检查它是否包含多数元素并确定它。考虑数组元素之间唯一可用的比较操作,即相等(a [i] == a [j]),在恒定时间内执行。 (提示:在算法中,将数组to[]分成两个子数组a1[]和a2[],每个子数组都是a[]大小的一半。如果a[]中的大部分元素是v,那么v一定是也是 a1 [] 或 a2 [] 或两者的大多数元素)。
int main() {
int a[12] = {5, 9, 3, 13, 5, 21, 5, 7, 17, 12, 5, 6};
int N = 12, lo = 0, hi = N - 1, mid,i,j;
mid = lo + (hi - lo) / 2;
int n1 = mid - lo + 1;
int n2 = hi - mid;
int a1[n1],a2[n2];
/* Copy data to temp arrays a1[] and a2[] */
for (i = 0; i < n1; i++)
a1[i] = a[lo + i];
for (j = 0; j < n2; j++)
a2[j] = a[mid+1+j];
while (i < n1 && j < n2) {
if(a1[i]==a2[j]){
}else if(){
}else{
}
}
return 0;
}
我在继续使用相等操作比较辅助数组以查看大多数元素是否在 a1[] 或 a2[] 或两者上的方式上遇到了麻烦!
【问题讨论】:
-
@AlbinPaul 似乎不允许 OP 排序。他不能使用其他比较而不是平等。
-
"如果 a [] 的大部分元素是 v,则 v 必须也是 a1 [] 或 a2 [] 或两者的大多数元素" - 但是逆推论不正确: 即使 v 在 eg 中占多数
a1[]不一定是a[]中的多数。 -
D-and-C 是必需的吗?有一个线性算法。
标签: c arrays algorithm divide-and-conquer