`
郑云飞
  • 浏览: 814080 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

10000000个不同的整型数求前100大数的算法

 
阅读更多

最快的做法时间复杂度就是O(NlogK) 
其中N是你的所有数据的大小,K是你想取最大的多少个。 

具体说就是循环所有的数据N,然后往一个PriorityQueue里面放(如果你用的是Java的话),这个Queue每次插入会自动排序,所以你需要做的就是当PriorityQueue的大小大于100的时候,每次看你下面循环的元素是否比这个PriorityQueue的第一个元素大,如果是的话,就抛弃第一个元素,把你现在循环的元素放进去。 
最后将PriorityQueue里面元素都打印出来就可以了。 

你循环所有的数据的事件复杂度是O(N),那个PriorityQueue内部用的是堆排序,所以你可能会以为结果是O(NlogN),实际上,当N远远大于K的时候,结果是近似O(NlogK)的。 

这个方法肯定是最快的了,想得到完美的数学证明的话,可以参考下面的文章: 
http://stackoverflow.com/questions/19227698/write-a-program-to-find-100-largest-numbers-out-of-an-array-of-1-billion-numbers

import java.util.ArrayList;
 
public class createDir {
private static int num[] =new int [10000000];
private static ArrayList<Object> ans=null;
public static void main(String[] arg){
for(int i = 0;i<10000000;i++){
num[i]= i+1;
}
boolean boo=true;
int i = 0;
while (boo) {
   int j = (int) (Math.random() * 10000000);
   int k = num[i];
   num[i] = num[j];
   num[j] = k;
   i++;
   if(i==100000){
   boo =false;
   }
}
long start =System.currentTimeMillis();
ans = new ArrayList<Object>();
for(int j = 0;j<10000000;j++){
if(j<10){
ans  = sort(ans,num[j]);
}else{
if(num[j]>(Integer)ans.get(0)){
ans = getMaxValue(ans,num[j]);
}
}
}
long end =System.currentTimeMillis();
long total= (end-start);
System.out.println(total + " ms");
System.out.println(ans);
}
private static ArrayList<Object> getMaxValue(ArrayList<Object> ans,int num){
for(int i=1;i<ans.size();i++){
if(num < (Integer) ans.get(i)){
ans.add(i,num);
ans.remove(0);
break;
}
if(i==ans.size()-1){
ans.add(num);
ans.remove(0);
break;
}
}
return ans;
}
private static ArrayList<Object> sort(ArrayList<Object> ans,int num){
if(ans.size()>0){
int min = (Integer) ans.get(0);
if(min>num){
ans.add(0, num);
}else if(ans.size()==1){
ans.add(num);
}else{
for(int i=1;i<ans.size();i++){
if(num < (Integer) ans.get(i)){
ans.add(i,num);
break;
}
if(i==ans.size()-1){
ans.add(num);
break;
}
}
}
}else{
ans.add(0, num);
}
 
return ans;
}
}

 

 

分享到:
评论

相关推荐

    C++程序设计——大数算法

    在C++编程中,大数算法是处理超过标准整型数据范围的大整数的一种技术。标准的`int`、`long`或`long long`类型无法有效地存储或操作极大的数值,因此,需要自定义数据结构和算法来实现大数运算。本主题将深入探讨...

    gaojingdu.rar_c 大数加法_c++大数除法_大数 加 减 乘 除_大数算法_高精度

    在标题“gaojingdu.rar_c 大数加法_c++大数除法_大数 加 减 乘 除_大数算法_高精度”中,我们关注的是用C语言和C++实现的高精度算法,特别是大数的加法、减法、乘法和除法。这些操作是基础数学运算,但在计算机中...

    大数相乘算法c语言

    在计算机科学中,大数相乘是处理超过标准整型数据范围的数字乘法问题。在C语言中,由于标准库并不直接支持大数运算,我们需要自己实现算法来处理这样的计算。这种算法通常涉及到数组或者链表来存储大数,并通过...

    大数阶乘算法

    在计算机科学中,大数阶乘算法是一种处理大数据量计算的算法,特别是在处理超过普通整型范围的数字乘法时,如计算一个大整数的阶乘。在本例中,我们将关注如何使用链表来实现这个算法,这种方式对初学者来说特别友好...

    两个大数相乘算法

    大数相乘算法是基础且关键的一环,它涉及到如何高效地计算两个超过普通整型变量所能表示范围的数的乘积。本主题将深入探讨如何用C语言实现大数相乘,并展示结果。 C语言本身并不直接支持大数运算,但我们可以自定义...

    大数除法算法

    因此,设计专门的大数算法来解决这类问题就显得尤为重要。“大数除法算法”就是一种用于执行两个大数之间除法运算的算法。它能够处理任意精度的数值,适用于加密技术、大数据分析等领域。 ### 算法基本原理 大数除...

    大数算法实现扩展欧拉算法

    大数算法是指能够处理超过标准整型范围的数值计算方法。当涉及到需要计算极大整数的最大公约数(Greatest Common Divisor, GCD)或寻找模逆元时,扩展欧拉算法(Extended Euclidean Algorithm)是一个非常关键的工具...

    【C#】求大数阶乘_算法_C#

    在编程领域,大数阶乘是一个常见的计算问题,特别是在算法设计和数学计算中。本话题主要探讨如何在C#环境中实现大数阶乘的计算,处理超过整型或长整型范围的数值。C#标准库并不直接支持大数运算,但我们可以利用各种...

    ACM-----大数算法与组合数学算法

    大数算法主要处理超出常规整型变量表示范围的数值运算,而组合数学则涉及解决复杂问题时使用的数学理论。以下是对这两种算法的详细介绍: **大数算法** 1. **大数加法** - 对齐数字:确保两个大数的位数相同,...

    大数算法PDF

    ### 大数算法概述 在处理数学运算时,经常会遇到参与运算的数字非常大或对运算结果的精度要求极高的情况。在这些情况下,传统的数据类型(如整型、浮点型)无法满足需求,因为它们都有固定的精度和位数限制。例如,...

    求两个多位大数的最大公因数算法

    对于大数操作,我们需要设计能够高效处理的算法,因为标准整型可能不足以存储这样的数值。 常见的求最大公因数的方法有欧几里得算法(Euclidean Algorithm),这是一种基于整除关系的迭代方法。它的基本思想是:...

    随机大数相乘C++实现代码

    其中,对于较小的大数,简单的竖式乘法可能已经足够,但对于非常大的数,更高效的算法是必要的。这里,我们以Karatsuba算法为例,它是一种分治算法,比传统的乘法算法更快。 ```cpp BigInt BigInt::multiply(const ...

    大数计算器乘法算法及代码

    ### 大数计算器乘法算法及代码解析 在计算机科学领域,处理大数运算是一项基本且重要的任务。当数值超出标准整型或浮点型变量所能表示的最大范围时,就需要用到特殊的方法来处理这些“大数”。本文将详细介绍一个...

    从键盘输入一组整数,通过分治算法求第二大的数

    ### 分治算法求第二大的数 #### 背景与目的 在计算机科学领域,分治算法是一种重要的问题解决策略,被广泛应用于多种算法设计之中。分治算法的基本思想是将一个复杂的问题分解成两个或更多的相同或相似的子问题,...

    大数相加jar包(一个简单算法的实现)

    标题中的“大数相加jar包(一个简单算法的实现)”指的是这个压缩包中包含了一个用Java语言编写的程序,它的主要功能是处理大数的相加操作。在计算机科学中,大数运算通常涉及到处理超过普通整型或浮点型所能表示...

    大数乘法能够实现2个200位以内数的乘法

    标题提到的“大数乘法能够实现2个200位以内数的乘法”,这主要涉及到大数运算的一种具体应用,特别是在不使用专用的大数库或数据结构的情况下。 当两个数的位数超过整型的最大限制(例如在32位系统中是4294967295,...

    大数阶乘算法的一个例子

    在编程领域,大数阶乘算法是一个挑战性的任务,因为普通的数据类型如整型或浮点型在处理较大数字的阶乘时很容易超出其表示范围,导致溢出错误。本篇将详细介绍一种处理大数阶乘的有效算法,并探讨如何通过扩展来应对...

    大数相乘算法解析,实现20位的大数相乘

    首先,我们用一个整型数组来表示一个大数。数组的每个元素存储大数的一位数字,大数d可以表示为: d = a[k] * 10^(k-1) + a[k-1] * 10^(k-2) + ... + a[2] * 10 + a[1] 其中,a[0]用来保存大数的位数。例如,如果...

    大数阶乘的C++算法实现

    本篇文章将详细讲解如何在C++中实现大数阶乘的算法,主要关注如何处理超出标准整型范围的数字运算。 首先,我们需要理解阶乘的概念。阶乘是一个正整数n的乘积,表示为n!,其中1! = 1,2! = 2 * 1,3! = 3 * 2 * 1,...

    大数的算法

    在IT领域,大数算法是处理超过常规整型或浮点型数据范围的数值计算时不可或缺的部分。随着数据科学和互联网技术的飞速发展,处理海量数据的需求日益增长,大数算法的重要性也随之提升。这些算法通常涉及到分布式计算...

Global site tag (gtag.js) - Google Analytics