分治与递归 | 5:主元素问题的三种解法
问题:设T[0:n-1]是n个元素的数组。对任一元素x, 设S(x)={ i | T[ i ] = x }。当|S(x)|>n/2时, 称x为主元素。 设计一个线性时间算法, 确定T[0:n-1]是否有一个主元素,如果有,则返回。
参考了一下网上的思路,大多是直接求主元素的问题。至于是否有主元素,我们假设存在,然后在求完后进行验证,如果不是,则答案值无效。
由主元素的定义可以推证如下定理:
定理1:如果x是数组a的主元素,那么x必也是数组a的中位数、众数
(x的个数已经超过数组a的一半)
定理2:如果存在主元素,那么主元素与非主元素的个数差count一定大于0
(设总体元素个数为 n,主元素个数为 k,则非主元素个数为 n-k。count = 2k - n > 0)
定理3:如果序列存在主元素,删除序列两个不同的元素,主元素不变。
(有两种情况:①删除的两个元素都不是主元素,那肯定影响主元素改变 ②删除的一个是主元素一个不是,count =2(k - 1) - (n -2) = 2k - n 不变)
定理4:序列至多存在一个主元素
方法一:直接排序找中位数 —— 时间复杂度 O(nlogn)
由定理1,可以直接快排找出中位数mid,然后检验mid是否为主元素。
时间复杂度主要取决于排序的时间,太慢了,不具体写了。
方法二:减治法 —— 时间复杂度 O(n)
我们可以用candidate来储存临时认为的主元素,count来记录在已遍历序列内主元素与非主元素的个数之差。最初:count=0.。对序列a[0 : n-1]遍历:
元素隐藏的三种方式对比 display:none opacity:0 visibility:hidden 项目需求 表面一个图片遮罩,鼠标hover遮罩消失,内部元素展现,其中有一个按钮在移动端是手指 ... JAVA 取出Map元素值 的三种方法: (1)方法一: 通过Map的keySet()方法获取key 的set ,迭代set元素(每个元素调再用Map的get()方法); (2)方法二 : 通过Map ... 将数组元素反转有多种实现方式,这里介绍常见的三种. 直接数组元素对换 @Test public void testReverseSelf() throws Exception {System.out. ... 搜索热词 递归函数在编程中是比较常用的一类函数,其特点是函数自身可以调用自身,但是必须在调用自身前有条件判断,否则会导致无限调用下去.本文列出了三种递归函数实现方法,第一种利用引用做参数,第二种利用全 ... 目录 题目 1.层序法: 2.递归法: 1.先序遍历(中左右) 2.后序遍历(左右中) 3.递归中序遍历为什么不行(左中右) 3.迭代法: 1.先序遍历 2.中序遍历 3.后序遍历 为什么迭代法的中序 ... 一.el.setAttribute('class','abc'); 复制代码 代码如下: <!DOCTYPE HTML> <HTML> <HEAD> <met ... form 对象(表单) 一个<form>标记,就是一个<form>对象: 1,form对象的属性 name :表单的名称,主要用来让JS来控制表单: action :表单的数据 ... 层序遍历分层的递归迭代解法 前言 一.二叉树层序遍历分层 二.递归与迭代 总结 参考文献 前言 层序遍历作为二叉树遍历的基本遍历,一般来说只能用迭代来解.但是分层输出则既可用迭代,又可配合level用 ... JavaScript中取得元素的方法有三种:分别是: 1.getElementById() 方法:通过id取得HTML元素. 2.getElementsByName()方法:通过name取得元素,是一 ...分治与递归 | 5:主元素问题的三种解法相关推荐
最新文章
热门文章