3秒搞定!~~ 一亿数据获取前100个最大值

3秒搞定!~~ 一亿数据获取前100个最大值

整合网络上的算法。 根据我的思路。计算一亿个数字中最大的前100个值。

昨晚效率还是很低。 今天搞的算法。 只需要3秒钟。 获取前100个 前1000个 速度都非常快。 


算法原理:

把一亿个数字的前100个 首先放入数组。 然后把最小值放在ary[0]。

然后再,循环100到一亿 之间的。 每次循环判断当前数字是否大于ary[0]

 当大于时,当前数字放入ary[0] 并再次重构数组最小值进入ary[0]  以此类推 。

当循环完这一亿个数字后。 最大的前100个数字就出来了。


源码分享地址:http://download.csdn.net/download/yjflinchong/4275241


腾讯面试题:一亿数字获取前100个最大的数字办法

比较笨的办法。效率有点低。 只是实现了功能。 期待牛人的算法。

我弄了个最佳方案 http://blog.csdn.net/yjflinchong/article/details/7533972    3秒就搞定了

一亿数字获取前100个最大的数字  这个方案需要700秒

///http://blog.csdn.net/yjflinchong/article/details/7532018

package com.my.util;


import java.io.*;
import java.util.*;
import java.net.*;

public class WebTest {

    public static int last = 333333333;
    public static int max = 100000000;//数据总数
    public static int sp = 1000000;//分割数据条数
    public static int[] ary = new int[100];
    
    
    public static void main(String[] args) {
        splitFile();
        Date d1 = new Date();
        find("d:/file/file.txt");
        System.out.println(Arrays.toString(ary)+"========");
        Date d2 = new Date();
        System.out.println(d2.getTime()-d1.getTime());
    }
    
    
    public static void splitFile(){
        StringBuffer str = new StringBuffer("");
        int num = 1;
        for (int i = 1; i < (max+1); i++) {
            str.append(i+"\t\n");
            if(i%1000000==0){
                appendToFile("d:/file/file.txt", str.toString());
                str = new StringBuffer("");
                num++;
            }
        }
        appendToFile("d:/file/file.txt", last+"");
    }

    public static void appendToFile(String file,String text){
        try
        {
            FileWriter fw =new FileWriter(file,true);
            BufferedWriter bw=new BufferedWriter(fw);
        bw.write(text);
        bw.flush();
        }catch (Exception e) {
        }  
       }   
        public static String readFile(String path){
             StringBuffer str = new StringBuffer("");
            try {
                String line = null;
               
                BufferedReader reader = new BufferedReader(new FileReader(path));
                while ((line = reader.readLine()) != null) {
                    str.append(line);
                }
                reader.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return str.toString();
        }
        public static void find(int[] bak){
            for (int i = 0; i < bak.length; i++) {
                ary[0] = bak[i];
                sort(ary);
            }
        }///http://blog.csdn.net/yjflinchong/article/details/7532018
        public static void find(String path){
            try {///http://blog.csdn.net/yjflinchong/
                String line = null;
                BufferedReader reader = new BufferedReader(new FileReader(path));
                while ((line = reader.readLine()) != null) {
                    ary[0] = Integer.parseInt(line.trim());
                    sort(ary);
                }
                reader.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        ///http://blog.csdn.net/yjflinchong/article/details/7532018
        public static void sort(int[] array){  
            for(int i = 0; i < array.length - 1; i++){  
                //当前值当作最小值  
                int min = array[i];  
                for(int j = i+1; j < array.length; j++){  
                    if(min>array[j]){  
                        //如果后面有比min值还小的就交换  
                        min = array[j];  
                        array[j] = array[i];  
                        array[i] = min;  
                    }  
                }  
            }  
        }  
        
        

}



一亿个数字判断其中相同数字的办法

一亿个数字判断其中相同数字的办法

package com.my.util;

//http://blog.csdn.net/yjflinchong
public class Test {
    
    int fnum = 21000000;
    
    public static void main(String[] args) {
        Test t = new Test();
        t.find();
    }
    
    
    public void find() {
        int total = 100000000;
        int size = total%32==0?total/32:total/32+1;
        int [] mBits=new int[size];
        for(int i=0;i<total;i++) {
            int num = getNum(i);
            if(get(mBits,num)) {
                System.out.println(num);
                break;
            }
             set1(mBits,num);
        }
    }
    //http://blog.csdn.net/yjflinchong
    public int getNum(int i) {
        //设定模拟重复的那个数字 fnum
        if(i==(fnum+1)){
            i--;
        }
        return i;
    }
    public void set1(int [] mBits, int pos) {  
        int index = ( int )Math.floor(pos/32f);
        mBits[index] = mBits[index] | (1 <<(31-pos%32 ));
    }
    public boolean get(int [] mBits, int pos){  
        int index = ( int )Math.floor(pos/32f);
        return mBits[index] == (mBits[index] | 1 <<(31-pos% 32 ));
     }

}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451408.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手把手JDK环境变量配置

分为下载&#xff0c;配置&#xff0c;验证三个步骤解释如何进行JDK环境变量配置。 步骤一&#xff1a; 首先查看配置成功后的效果&#xff1a; tip:点击win——>运行&#xff08;或者使用winr,或者shift鼠标右键打开powershell&#xff09;——>输入cmd回车——>控制…

网易NEI在面临前后端分离问题,所提供的完整解决方案

内容来源&#xff1a;2018 年 1 月5 日&#xff0c;网易NEI产品负责人包勇明在“2018移动技术创新大会”进行《网易高效多端应用协作开发实践》演讲分享。IT 大咖说&#xff08;微信id&#xff1a;itdakashuo&#xff09;作为独家视频合作方&#xff0c;经主办方和讲者审阅授权…

如何使用js动态显示或隐藏DIV

在web页面中&#xff0c;经常需要使用select控件来显示div的显示与隐藏&#xff0c;实现这个方法主要用到了setAttribute方法&#xff0c;以下为示例代码 [html] view plaincopy <html> <title>通过选择项显示不同的结果</title> <head> <scr…

myeclipse进入Myeclipse configuration center 如何关闭

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 找到这个图标&#xff0c;放上去显示return即可关闭&#xff0c;隐藏很深有木有

程序员保持身心健康的八种方式

程序员是一个辛苦的行业&#xff0c;长时间面对的只是需要解决的问题&#xff0c;更不要提开发期限和无理取闹的客户了&#xff0c;这样的工作简直无以承受。怎么办呢我们&#xff1f;我们热爱编程&#xff0c;乐于创建功能……我们喜欢那种将一堆代码弄成像Facebook或者Digg那…

[No0000166]CPU的组成结构及其原理

中央处理器(Central Processing Unit, CPU)CPU的基本架构和工作原理其实百科上讲得已经相当清楚了&#xff0c;不过我觉得有些事情呢还是给个例子出来比较方便学习。本文会先从内存地址&#xff0c;计算机的一般架构之类的基础知识出发&#xff0c;然后逐步为读者"拼装&qu…

Java 时间总结

转载请标明出处&#xff1a;http://blog.csdn.net/zhaoyanjun6/article/details/80613024 本文出自【赵彦军的博客】 时区 整个地球分为二十四时区&#xff0c;每个时区都有自己的本地时间。为了统一起见&#xff0c;使用一个统一的时间&#xff0c;称为通用协调时(UTC, Univer…

js中的var是什么意思

声明&#xff08;创建&#xff09; JavaScript 变量 在 JavaScript 中创建变量经常被称为“声明”变量。您可以通过 var 语句来声明 JavaScript 变量&#xff1a;var x; var carname; 在以上声明之后&#xff0c;变量并没有值&#xff0c;不过您可以在声明它们时向变量赋值&…

HTTP/2 协议入门

一、2015年&#xff0c; HTTP/2发布。 二、二进制协议 HTTP/2是一个二进制协议&#xff0c;头信息和数据体都是二进制&#xff0c;并且统称为“帧”&#xff08;frame&#xff09;,头信息帧和数据帧。 二进制协议的一个好处是&#xff0c;可以定义额外的帧。HTTP/2定义了近1…

态度决定高度

“一个将什么都不放在眼里的人&#xff0c;他的未来一定是一片黑暗&#xff0c;因为他什么都看不到”。知识的获得和能力的锻炼是个一点一滴慢慢积累的过程&#xff0c;这个过程需要我们端正态度&#xff0c;俯身求教。好高骛远一直都是很多人容易犯的错误&#xff0c;这样导致…

中间件技术是什么?

&#xff08;一&#xff09;举例说明&#xff1a; 我开了一家炸鸡店&#xff08;业务端&#xff09;&#xff0c;然而周边有太多屠鸡场&#xff08;底层&#xff09;&#xff0c;为了成本我肯定想一个个比价&#xff0c;再综合质量挑选一家屠鸡场合作&#xff08;适配不同底层逻…

4.10/4.11/4.12 lvm讲解 4.13 磁盘故障小案例

2019独角兽企业重金招聘Python工程师标准>>> 准备磁盘分区 fdisk /dev/sdb n 创建三个新分区&#xff0c;分别1G t 改变分区类型为8e 准备物理卷 pvcreate /dev/sdb1 pvcreate /dev/sdb2 pvcreate /dev/sdb3 pvdisplay/pvs 列出当前的物理卷 pvremove /dev/sdb3 删除…

《Effective Java》 第一讲:创建和销毁对象

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、用静态工厂方法代替构造器 用静态工厂的优点 &#xff1a; 1. 方法有名字&#xff0c;更好理解。 2.不必每次调用的时候都创建一…

外围功能电路控制 LET′S TRY“嵌入式编程”: 4 of 6

外围功能电路控制 LET′S TRY“嵌入式编程”: 4 of 6本连载讲解作为嵌入式系统开发技术人员所必需具备的单片机的基础知识。 在《单片机入门&#xff08;1&#xff09;&#xff5e;&#xff08;3&#xff09;》中&#xff0c;我们一起学习了单片机的硬件和编程语言以及开发环境…

如何防止代码腐烂

很多团队都有这个问题&#xff0c;一个项目的代码本来开始设计得好好的&#xff0c;一段时间以后&#xff0c;代码就会变得难以理解&#xff0c;难以维护&#xff0c;难以修改。为什么&#xff1f;我一直在思考这个问题。 让我们先看一个人的情况。 1. 程序员的成长 新手的代码…

什么是商业智能(BI),以及其与数据分析的区别?

BI&#xff08;Business Intelligence&#xff09;即商务智能&#xff0c;它是一套完整的解决方案&#xff0c;用来将企业中现有的数据进行有效的整合&#xff0c;快速准确地提供报表并提出决策依据&#xff0c;帮助企业做出明智的业务经营决策。它是一种产品/服务&#xff0c;…

php课程 4-15 数组遍历、超全局数组、表单提交数据(多看学习视频)

php课程 4-15 数组遍历、超全局数组、表单提交数据&#xff08;多看学习视频&#xff09; 一、总结 一句话总结&#xff1a;超全局数组特别有用&#xff0c;比如$_SERVER可以获取所有的客户端访问服务器的情况。 1、数组遍历三种方式&#xff08;最不熟悉的那一种&#xff09;…

git branch 分支

Git自学之路&#xff08;四&#xff09;- git branch 分支 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来&#xff0c;以免影响开发主线。 在很多版本控制系统中&#xff0c;这是一个略微低效的过程——常常需要完全创建一…

软件工程师的十个“不职业”行为

职业化是软件工程师的必然选择。本文根据我在教学和软件开发管理方面的实践&#xff0c;列举几个软件工程师“不职业”的行为或习惯&#xff0c;从另外一个侧面进一步探讨什么是真正的软件工程师职业化。职业化之于软件工程师非常重要。因为&#xff1a;软件是看不见也摸不着的…

fn:substring()函数

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 fn:substring()函数返回字符串中指定开始和结束索引的子串。 语法 fn:substring()函数的语法如下&#xff1a; ${fn:substring(<s…