user-0 提问: 一个算法问题, 想不明白

回复:
user: user-0
content: 引用 10 楼 zilaishuichina 的回复:同样当元素个数是奇数个的时候， 无法推出证明1  代码写好了 http://www.cnblogs.com/XiangfeiAi/p/4758939.html

user: user-0
content: 引用 10 楼 zilaishuichina 的回复:同样当元素个数是奇数个的时候， 无法推出证明1  如果前N-1个元素有主元, 那么最后一个元素不管是不是主元都对结果没有影响;  而如果前N-1个元素没有主元, 那么加上最后一个元素之后, 就有可能使整个数组存在主元, 所以最后一个元素有可能是主元   所以最后的算法应该是这样的. 如果数组元素的个数是偶数, 就找出候选元, 然后再遍历整个数组, 确定这个候选元是否是主元 如果数组元素的个数是奇数, 那么就先从前N-1个元素中找出候选元,      遍历整个数组, 如果这个候选元就是主元, 那么就结束了,      遍历整个数组, 如果这个候选元不是主元, 那么就把最后一个元素当做候选元, 再遍历数组, 确定这个候选元是否就是主元

user: user-1
content: 同样当元素个数是奇数个的时候， 无法推出证明1

user: user-1
content: 这个算法 我细想一下，觉得还是仅限于偶数个元素的时候，奇数个元素是不对的  3，1，3，1，3，1，3，1，3，1，3 以上排列，落单的元素如果不算的话，是无解的  3，3，3，3，3，3，1，1，1，1，1 以上排列，落单的元素如果算的话，是无解的

user: user-1
content: 引用 7 楼 axf1766567189 的回复:[quote=引用 3 楼 zilaishuichina 的回复:] 算法应该少了一条当出现奇数个元素的时候，落单的那一个不需要比较，直接放入数组B  题目已经说了，“主要元素是一个出现次数超过N/2的元素”，这是一个关键条件  也就是说 比如: N=10， 主要元素是3，则3出现的次数>=6 需要证明的点1：6个3随机分布在大小为10的容器中，必定有至少1次的连续下标的2个元素均为3。 反证：任意2个3都不连续（也就是1次都没有）的极端情况是5个3依次被另一个元素隔开：3，1，3，1，3，1，3，1，3，1 所以用第6个3替换1的任意一个的位置，都会出现至少1次连续的2个3。  需要证明的点2：连续的两个3出现的位置下标，必定是i*2，i*2+1 反证：任意2个连续的3的下标都是i*2+1，(i + 1) * 2的极端情况是：1，3，3，1，1，3，3，1，1，3 所以用第6个3替换1的任意一个的位置，都会出现至少1次连续的两个3出现的位置下标，必定是i*2，i*2+1  据此可以证明B数组中一定包含候选元  需要证明的点3：B数组中候选元的个数出现次数>CountB/2 反证：如果B中候选元的个数出现次数<=CountB/2，举个B的极端情况，3，3，3，1，2，4 根据“比较A1和A2，如果它们相等则取其中之一加到数组B中；否则什么都不做”规则反推A，A必定包含3，3，3，3，3，3，1，1，2，2，4，4(这些元素组成的数组我们定义为A的子数组A`，D后面可能还有其他元素，我们定义为A的子数组A``)，分情况 1：A``的元素个数为0，那么在A中3的个数 = CountA` / 2 + 0 / 2 = CountA/2，A中3的个数不满足>CountA/2的条件 2：A``的元素个数大于0，最好情况有1半都是3，（因为如果A``的3超过一半，根据证明1和证明2，B中必定会在现有元素基础上多出至少1个候选元3），此时A中3的个数 CountA` / 2+ CountA`` / 2 =  CountA/2，A中3的个数不满足>CountA/2的条件 所以B数组中候选元的个数出现次数>CountB/2  你的逻辑好严格呀, 看了之后瞬间明白了, 其实最主要的第3个证明.  另外, 请问一下, 怎样才能达到你这样的思维? [/quote]  逻辑思维是程序员的基本功呀，我也没有专门训练过，这个我就不知道该怎么回答了

user: user-0
content: 引用 3 楼 zilaishuichina 的回复:算法应该少了一条当出现奇数个元素的时候，落单的那一个不需要比较，直接放入数组B  题目已经说了，“主要元素是一个出现次数超过N/2的元素”，这是一个关键条件  也就是说 比如: N=10， 主要元素是3，则3出现的次数>=6 需要证明的点1：6个3随机分布在大小为10的容器中，必定有至少1次的连续下标的2个元素均为3。 反证：任意2个3都不连续（也就是1次都没有）的极端情况是5个3依次被另一个元素隔开：3，1，3，1，3，1，3，1，3，1 所以用第6个3替换1的任意一个的位置，都会出现至少1次连续的2个3。  需要证明的点2：连续的两个3出现的位置下标，必定是i*2，i*2+1 反证：任意2个连续的3的下标都是i*2+1，(i + 1) * 2的极端情况是：1，3，3，1，1，3，3，1，1，3 所以用第6个3替换1的任意一个的位置，都会出现至少1次连续的两个3出现的位置下标，必定是i*2，i*2+1  据此可以证明B数组中一定包含候选元  需要证明的点3：B数组中候选元的个数出现次数>CountB/2 反证：如果B中候选元的个数出现次数<=CountB/2，举个B的极端情况，3，3，3，1，2，4 根据“比较A1和A2，如果它们相等则取其中之一加到数组B中；否则什么都不做”规则反推A，A必定包含3，3，3，3，3，3，1，1，2，2，4，4(这些元素组成的数组我们定义为A的子数组A`，D后面可能还有其他元素，我们定义为A的子数组A``)，分情况 1：A``的元素个数为0，那么在A中3的个数 = CountA` / 2 + 0 / 2 = CountA/2，A中3的个数不满足>CountA/2的条件 2：A``的元素个数大于0，最好情况有1半都是3，（因为如果A``的3超过一半，根据证明1和证明2，B中必定会在现有元素基础上多出至少1个候选元3），此时A中3的个数 CountA` / 2+ CountA`` / 2 =  CountA/2，A中3的个数不满足>CountA/2的条件 所以B数组中候选元的个数出现次数>CountB/2  你的逻辑好严格呀, 看了之后瞬间明白了, 其实最主要的第3个证明.  另外, 请问一下, 怎样才能达到你这样的思维?

user: user-2

user: user-3
content: (假设有主要元素，也就是候选元，找出后再检验) 设 x：A主要元素，y：B主要元素，z：A中x外任意元素 1)N为偶数, 将A分为N/2对，(A1A2,  A3A4, ...) ，显然y为相同最多的那个(比如 ：11 11 22 12， y = 1). 假设有a对 xx，b对zz，则A中x最多个数为  2a+(N/2 - a - b) >N/2   故 a>b， 所以y = x. 2)N为奇数  若A最后一个元素为x，则a>=b，再加上最后一个，故y=x. 若A最后一个元素不为x，则A中x最多个数为a>b+1, 故y=x 所以B的候选元就是A的候选元

user: user-1
content: D后面可能还有其他元素  -》 A`后面可能还有其他元素

user: user-1
content: 算法应该少了一条当出现奇数个元素的时候，落单的那一个不需要比较，直接放入数组B  题目已经说了，“主要元素是一个出现次数超过N/2的元素”，这是一个关键条件  也就是说 比如: N=10， 主要元素是3，则3出现的次数>=6 需要证明的点1：6个3随机分布在大小为10的容器中，必定有至少1次的连续下标的2个元素均为3。 反证：任意2个3都不连续（也就是1次都没有）的极端情况是5个3依次被另一个元素隔开：3，1，3，1，3，1，3，1，3，1 所以用第6个3替换1的任意一个的位置，都会出现至少1次连续的2个3。  需要证明的点2：连续的两个3出现的位置下标，必定是i*2，i*2+1 反证：任意2个连续的3的下标都是i*2+1，(i + 1) * 2的极端情况是：1，3，3，1，1，3，3，1，1，3 所以用第6个3替换1的任意一个的位置，都会出现至少1次连续的两个3出现的位置下标，必定是i*2，i*2+1  据此可以证明B数组中一定包含候选元  需要证明的点3：B数组中候选元的个数出现次数>CountB/2 反证：如果B中候选元的个数出现次数<=CountB/2，举个B的极端情况，3，3，3，1，2，4 根据“比较A1和A2，如果它们相等则取其中之一加到数组B中；否则什么都不做”规则反推A，A必定包含3，3，3，3，3，3，1，1，2，2，4，4(这些元素组成的数组我们定义为A的子数组A`，D后面可能还有其他元素，我们定义为A的子数组A``)，分情况 1：A``的元素个数为0，那么在A中3的个数 = CountA` / 2 + 0 / 2 = CountA/2，A中3的个数不满足>CountA/2的条件 2：A``的元素个数大于0，最好情况有1半都是3，（因为如果A``的3超过一半，根据证明1和证明2，B中必定会在现有元素基础上多出至少1个候选元3），此时A中3的个数 CountA` / 2+ CountA`` / 2 =  CountA/2，A中3的个数不满足>CountA/2的条件 所以B数组中候选元的个数出现次数>CountB/2

user: user-4
content: 感觉题目的N应该是偶数, 因为如果是奇数就不好处理了. 如下: N为5, 那么数组可能为 XOXOX

user: user-4
content: 在我的理解中原有数组A中的主要元素超过N/2个, 那么在数组A中一定存在连续3个相连的主要元素 如下:假设N为6, 那么数组可能为 XXXOXO