Algorithm 算法|多数元素
我正在尝试编写一个算法,如果数组中存在多数元素,则返回true,否则返回false。 编辑:我只能判断两个元素是否相等。意思是我不能使用<或>,只有=。 编辑:解决方案应采用分而治之的方法。 它的运行时不应该超过nlogn,我用java写了一些东西,但我不确定它是否正确以及如何计算运行时。。 以下是我得到的:Algorithm 算法|多数元素,algorithm,runtime,element,Algorithm,Runtime,Element,我正在尝试编写一个算法,如果数组中存在多数元素,则返回true,否则返回false。 编辑:我只能判断两个元素是否相等。意思是我不能使用,只有=。 编辑:解决方案应采用分而治之的方法。 它的运行时不应该超过nlogn,我用java写了一些东西,但我不确定它是否正确以及如何计算运行时。。 以下是我得到的: public static boolean MajorityBoolean(int[] arr) { int c; int n = arr.length; for (in
public static boolean MajorityBoolean(int[] arr) {
int c;
int n = arr.length;
for (int i = 0; i < n; i = i + 2) {
System.out.println("*");
if ((arr[i] == arr[(i + 1)%n]) || ((arr[i] == arr[(i - 1+n)%n]))) {
c = 0;
for (int j = 0; j < n; j = j + 1)
if (arr[j] == arr[i])
c = c + 1;
if (c > n / 2)
return true;
}
}
return false;
}
公共静态布尔多数布尔(int[]arr){
INTC;
int n=阵列长度;
对于(int i=0;in/2)
返回true;
}
}
返回false;
}
所述算法的运行时间为O(n^2)
。外循环被执行n/2次
,因此内部计数器j
被重置n/2次
,因此内循环总共被执行O(n^2)
次
我不确定我是否遵循了您想法背后的逻辑,但这里有两种方法可以实现它(在高级伪代码中):
(1) 从数据中创建一个
- 创建一个[键是元素,值是发生次数]
- 迭代数组,并计算每个元素出现的次数
- 迭代直方图并找出是否存在唯一的最大值
- 如果存在-return true,否则返回false
- 对数组排序-结果是,所有相等的元素彼此相邻。您可以使用它进行排序
- 计算每个元素出现的次数[类似于直方图的想法],并找出是否存在唯一的最大值。实际上,您不需要维护所有元素的数据,只需维护前2个元素的数据,最后查看它们是否相同即可
O(nlogn)
average+最坏情况[实际上,根据排序-t给出的是O(nlogn)
最坏情况,而给出的是O(n^2)
最坏情况,两者在平均情况下都是O(nlogn)
]
编辑:
我误解了手头的问题,我以为你在看是否有一个独特的最大值。这两种解决方案仍然适用于该问题,您只需修改每种解决方案的最后一步[以检查最常见的元素是否出现超过一半的时间,这在O(n)
]中也是相当容易和可行的]
此外,还有另一种解决方案:使用查找中位数,找到后,检查它是否是多数元素,如果是,则返回。由于选择算法是基于分治的解决方案,我认为它适合您的需要。下面是一个O(n)解决方案
大小为n的数组A[]中的多数元素是出现n/2次以上的元素
public static boolean find(int[] arr, int size) {
int count = 0, i, mElement;
for (i = 0; i < size; i++) {
if (count == 0)
mElement = arr[i];
if (arr[i] == mElement)
count++;
else
count--;
}
count = 0;
for (i = 0; i < size; i++)
if (arr[i] == mElement)
count++;
if (count > size/2)
return true;
return false;
}
公共静态布尔查找(int[]arr,int size){
int count=0,i,mElement;
对于(i=0;i大小/2)
返回true;
返回false;
}
我添加了一个家庭作业标签,因为似乎是这样。如果我错了,请纠正我。特别是可能的重复,是重复问题的最佳解决方案。首先,感谢您的帮助!其次,我的想法是,在每个具有多数元素的数组中,必须有两个相同的数字,一个接一个(考虑到数组是一种圆,因此最后一个元素接近第一个元素)。这是个好主意吗?顺便说一句,显然我必须用分而治之的方法编写算法,所以我的算法不好(而且它的运行时间是O(n²),大于(nlogn))。@shachar0n:(1)我仍然不遵循逻辑,为什么数组是圆形的?:\。(2) 我误解了这个问题,我以为你在看是否有一个独特的最大值。这两种解决方案仍然适用于手头的问题,在每个解决方案的最后一步中都进行了Slot修改。(3) 您所描述的问题可以通过以下方法解决。找到中间值,然后看看它是否是多数元素。选择算法实际上是一种分而治之的解决方案。(1)假设一个数组有一个多数元素,那么它必须有两个相同的紧密元素。如果数组是这样的:1010101,那么最后一个和第一个元素是相同的——这就是我将数组视为一个圆(使用模%)的意思。(2) (3)我忘了提到另一个限制:我只能知道两个元素是否相同,但我无法判断其中一个元素是否大于另一个,这意味着我只能使用=和不能使用:>这是一个好的解决方案,但如果可以,你应该投票关闭重复的问题,或者如果不能,就简单地对问题进行评论。