Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 算法|多数元素_Algorithm_Runtime_Element - Fatal编程技术网

Algorithm 算法|多数元素

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

我正在尝试编写一个算法,如果数组中存在多数元素,则返回true,否则返回false。 编辑:我只能判断两个元素是否相等。意思是我不能使用<或>,只有=。 编辑:解决方案应采用分而治之的方法。 它的运行时不应该超过nlogn,我用java写了一些东西,但我不确定它是否正确以及如何计算运行时。。 以下是我得到的:

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
如果使用a作为映射,则此方法是O(n)的平均值

(2) 排序并查找最大发生率:

  • 对数组排序-结果是,所有相等的元素彼此相邻。您可以使用它进行排序
  • 计算每个元素出现的次数[类似于直方图的想法],并找出是否存在唯一的最大值。实际上,您不需要维护所有元素的数据,只需维护前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)我忘了提到另一个限制:我只能知道两个元素是否相同,但我无法判断其中一个元素是否大于另一个,这意味着我只能使用=和不能使用:>这是一个好的解决方案,但如果可以,你应该投票关闭重复的问题,或者如果不能,就简单地对问题进行评论。