`
yiminghe
  • 浏览: 1461821 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

主要素问题分析

阅读更多

算法方面 有名的主要素问题:

找到一个数组中 出现 次数 超过一半数组大小的数

 

三种解法:

 

import java.util.Arrays;
import java.util.ArrayList;

/**
 * Author: yiminghe
 * Date: 2008-10-15
 * Time: 19:33:34
 * Any problem ,contact yiminghe@fudan.edu.cn.
 */


//找到一个数,它在数组中出现次数大于数组的大小一半
public class Majority {

    private static void swap(int[] array, int index1, int index2) {
        int t = array[index1];
        array[index1] = array[index2];
        array[index2] = t;
    }

    //以 array[start] 分隔
    private static int partiton(int[] array, int start, int end) {
        int vindex = start;
        int v = array[start];
        for (int i = start + 1; i <= end; i++) {
            if (array[i] < v)
                swap(array, ++vindex, i);
        }

        swap(array, vindex, start);


        return vindex;
    }


    //找到第 desire+1  大的数
    private static int select(int[] array, int start, int end, int desire) {
        if (start == end)
            return array[start];
        //升序
        int q = partiton(array, start, end);

        if (q == desire)
            return array[desire];

        if (q > desire)
            return select(array, start, q - 1, desire);

        else
            return select(array, q + 1, end, desire);


    }

    //中位数才有可能是,否则没有    O(n)  算法
    public static int majority(int[] array) {
        int m = (array.length - 1) / 2;
        int middle = select(array, 0, array.length - 1, m);
        int count = 0;
        for (int i = 0; i < array.length; i++) {
            if (array[i] == middle)
                count++;
        }

        if (count > array.length / 2)
            return middle;
        return -1;
    }


    //是否占据一半
    private static boolean isMajority(int[] array, int start, int end, int v) {
        int count = 0;
        for (int i = start; i <= end; i++) {
            if (array[i] == v)
                count++;
        }

        if (count > (end - start + 1) / 2)
            return true;
        return false;
    }


    //   不采用 元素比大小的方法 ,O(nlogn)
    public static int majorityNoEqual(int[] array, int start, int end) {
        if (end - start < 4) {
            for (int i = start; i <= end; i++) {
                if (isMajority(array, start, end, array[i]))
                    return array[i];
            }
            return -1;
        }

        int k = (start + end) / 2;
        int l = majorityNoEqual(array, start, k);
        if (l != -1 && isMajority(array, start, end, l))
            return l;
        l = majorityNoEqual(array, k + 1, end);
        if (l != -1 && isMajority(array, start, end, l))
            return l;
        return -1;
    }


    //一个很好的方法 ,不比较之间元素   ,O(n)
    public static int majorityNoEqual2(int[] array) {
        if (array.length < 4) {
            for (int i = 0; i < array.length; i++) {
                if (isMajority(array, 0, array.length - 1, array[i]))
                    return array[i];
            }
            return -1;
        }

        int k = (array.length) / 2;
        ArrayList<Integer> q = new ArrayList<Integer>();
        for (int i = 0; i < k; i++) {
            if (array[2 * i] == array[2 * i + 1]) {
                q.add(array[2 * i]);
            }
        }
        int[] q_array = new int[q.size()];
        for (int i = 0; i < q.size(); i++)
            q_array[i] = q.get(i);
        int q_m = majorityNoEqual2(q_array);

        // 必在 1/2 子数组 或 就是 最后一个元素

        if (q_m != -1 && isMajority(array, 0, array.length - 1, q_m))
            return q_m;
        if (isMajority(array, 0, array.length - 1, array[array.length - 1]))
            return array[array.length - 1];
        return -1;

    }


    public static void main(String[] args) {
        int[] array = {2, 2, 2, 2, 2, 2, 19, 78, 6, 9, 4};
        System.out.println(majority(array));
        System.out.println(majorityNoEqual(array, 0, array.length - 1));
        System.out.println(majorityNoEqual2(array));
    }
}

 

 

分享到:
评论

相关推荐

    虫草素生物合成浅析

    随后的十余年中,科学家们通过光谱数据分析,核磁共振等技术手段,逐渐揭开了虫草素的分子结构之谜,最终确认其为3’-脱氧腺苷。 虫草素的生物合成路径一直是研究者关注的焦点。通过回顾研究历程,文章作者推测,...

    哈尔乌素露天煤矿运输设备保养中存在的问题与对策

    这显示文章的研究是系统性的,从现状到问题分析再到解决对策,形成了完整的论证过程。 3. 标签解读: 从标签可知,文章的核心知识点是“露天煤矿”、“设备保养”、“预防”和“影响因素”。这意味着文章将在露天...

    关于银行对中小微企业信贷决策问题的研究(7).pdf

    本文主要研究银行对中小微企业的信贷决策问题,通过数学建模和数据分析,建立了基于风险评估和信贷策略优化的模型。该模型考虑了中小微企业的信贷风险、企业实力、突发情况等因素,并使用 Excel 和 Matlab 软件进行...

    全球纤维素市场现状与未来趋势分析报告.pdf

    #### 三、主要生产企业分析 全球纤维素市场的核心生产商包括IP、Suzano、APP、UMP和Stora Enso等。这些企业在纤维素生产方面拥有丰富的经验和先进的技术,其中IP是国际知名的纸浆和造纸巨头,Suzano则是巴西最大的...

    2022-2028全球与中国多粘菌素市场现状及未来发展趋势

    随着全球对抗生素耐药性问题的关注度提高,多粘菌素的需求预计将保持上升。制造商需要不断创新,优化生产流程,提高产品质量,以满足日益增长的市场需求并应对激烈的市场竞争。同时,政策环境的变化和新研发的抗生素...

    2020年纳米纤维素行业研究报告.rar

    在市场分析部分,报告提供了全球纳米纤维素市场的规模、增长趋势以及主要参与者的信息。2020年,尽管受到全球经济波动的影响,纳米纤维素市场仍显示出稳健的增长态势,尤其在包装、复合材料和生物医学等领域的需求...

    2021年乙基纤维素行业需求分析及前景投资报告.pptx

    乙基纤维素行业是化工领域的一个分支,主要涉及乙基...综合以上分析,乙基纤维素行业未来投资前景乐观,但也面临着市场竞争加剧、技术更新快速等问题,投资者需深入理解行业特性和市场动态,以便做出明智的投资决策。

    代素蓉-2120200418-第二次作业_IP流量分析程序_python_Windows平台上基于原始套接字_

    作业题目:网络流量分析程序设计起止日期:2020-10-29 08:00:00 ~ 2020-11-22 23:59:59作业满分:100作业说明:实现一个IP流量分析程序,具体要求:(1)Windows平台上,基于原始套接字,图形用户界面,编程语言不限...

    青蒿素市场研究报告

    报告中可能会分析主要生产国如中国、印度的产量变化,以及新兴市场的潜力。此外,青蒿素的市场结构、竞争格局、价格走势及供需平衡也是研究的重点。 四、研发与创新 为了应对疟原虫对青蒿素的耐药性问题,科研机构...

    综合护理干预对无肝素血液透析患者HAMA凝血程度及不良反应率的影响分析

    综合护理干预对无肝素血液透析患者的影响分析是一篇深入探讨专业医疗护理领域的研究文献。文章聚焦于无肝素血液透析治疗这一特定医疗过程,特别是肾衰竭患者的治疗,以及在这一过程中实施的综合性护理干预措施如何...

    水溶性茶渣半纤维素的树脂脱色研究

    具体分析如下: 1. 半纤维素的特性与应用价值: 半纤维素是植物细胞壁的主要成分之一,与纤维素和木质素共同构成了植物组织的基本骨架。半纤维素在结构和功能上的多样性使其成为农林生物质资源中的一大亮点。它具有...

    素描与色彩课程标准.doc

    色彩部分主要以水粉教学为主,旨在提升学生对色彩的理解和分析,从而增强设计和创新能力。 课程目标旨在让学生掌握素描和色彩的基本理论、造型规律和艺术创作技巧,包括熟知素描历史、理解结构素描和创意素描概念、...

    09年碳素厂工作总结.doc

    关键在于提升对技术问题的认识,复杂问题需深入分析,以确保细节的精准处理,避免责任推诿,促进团队协作。此外,推动技术创新和自动化应用,对新项目进行运行技术评估,确保了工艺的稳定性和效率。基础数据的收集和...

Global site tag (gtag.js) - Google Analytics