- 浏览: 240114 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
DeepThought:
必须赞一个 用了各种方法 最终还是改了repo才能下载! Th ...
Android源码下载出现的问题 -
wj10000:
,这个不错呀,还准备用js 实现这个来着 ....
自己写jstl标签解析long时间 -
wjjxf:
xubingok 写道System.out.println是J ...
Android无法System.out.println出null -
xubingok:
System.out.println是JDK中的io流中的方法 ...
Android无法System.out.println出null -
JjayLee:
你可以更详细一点。。。
android网络连接Wifi和cmnet及cmwap的问题
看到说从1亿个数中选取最大的100个,要求性能最好,本人也就试试了下,方法是维护一个有100个数字的数组,该数组按照从大到小排序,每来一个数,从下标0开始到100,如果比任何一个数字大,则放在此位置,同时后面的数字后移一位。或者这100个数字用链表表示,好处就是不需要逐个后移。我把前一种方法成为T1,后一种称为T2。这仅是本人的想法,如果有更好的方法,欢迎提出改正。
在测试的时候,我使用了单线程排序和多线程排序,分别计算时间。
下面是测试结果:
T1单线程和多线程:
T2单线程和多线程:
分析结果,发现2个线程比1个线程快近一倍,究其原因,,在任务管理器中查看一个线程是占用的CPU是50%,2个线程是99%,所以快进一倍,如果是10个线程还是占100%CPU,相比并未快多少,反而增加了线程的开销。可见,多线程适合分工做各自的事情,不适合一起做同一件事情!至于使用数组存储还是链式存储,由于只是100个数字,移动100个数字的开销非常小,所以2者结果差不多。
算法还能改进,改进点就是在插入排序这个算法上,如何使得将这个数最快的插入前100个数中?
后面是代码:很乱,供参考:
T1.java:
T2.java;维持top100数据
LinkNode.java:链表
Top100Thread.java:多线程
在测试的时候,我使用了单线程排序和多线程排序,分别计算时间。
下面是测试结果:
T1单线程和多线程:
T2单线程和多线程:
分析结果,发现2个线程比1个线程快近一倍,究其原因,,在任务管理器中查看一个线程是占用的CPU是50%,2个线程是99%,所以快进一倍,如果是10个线程还是占100%CPU,相比并未快多少,反而增加了线程的开销。可见,多线程适合分工做各自的事情,不适合一起做同一件事情!至于使用数组存储还是链式存储,由于只是100个数字,移动100个数字的开销非常小,所以2者结果差不多。
算法还能改进,改进点就是在插入排序这个算法上,如何使得将这个数最快的插入前100个数中?
后面是代码:很乱,供参考:
T1.java:
package ddd; import java.util.Date; import java.util.Random; public class T1 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub long st = 0;long et=0; int[] test =new int[100000000];//1亿个数字 Random r = new Random(); T2 t = new T2(); t.print("开始随机生成数组:"+new Date()); for(int i=0;i<test.length;i++){ test[i] = r.nextInt(test.length * 2); } t.print("\n随机生成数完毕组:"+new Date()+",开始找最大的100个数"); st = System.currentTimeMillis(); for(int i=0;i<test.length;i++){ t.insert(test[i]); } et = System.currentTimeMillis(); t.print("T1总用时:"+(et-st)+"ms\n"); t.printResult(); // t.print("下面第二种方法开始计算\n"); // //第二种方法 // T2 t2 = new T2(); // st = System.currentTimeMillis(); // for(int i=0;i<test.length;i++){ // t2.insert(test[i]); // } // et = System.currentTimeMillis(); // t2.print("总用时:"+(et-st)+"ms\n"); // t2.printResult(); // t.print("下面第三种方法开始计算\n"); //第三种方法 T2 t3 = new T2(true); st = System.currentTimeMillis(); for(int i=0;i<test.length;i++){ t3.insert2(test[i]); } et = System.currentTimeMillis(); t3.print("T2第三种总用时:"+(et-st)+"ms\n"); t3.printLinkResult(); // t.print("下面多线程方法开始计算\n"); // st = System.currentTimeMillis(); // Top100Thread[] threads = new Top100Thread[2]; // //下面准备用10个线程分别计算 // for(int i=0;i<2;i++){ // threads[i] = new Top100Thread(false, test,i*50000000,i*50000000+50000000); // threads[i].start(); // } // for(int i=0;i<2;i++){ // try { // threads[i].join();//尝试等待10个线程完毕 // } catch (InterruptedException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // } // //下面将10个线程的10×100数字集合起来选出top100 // // T2 t4 = new T2(); // int[] temp = null; // for(int i=0;i<2;i++){ // temp = threads[i].getTop100(); // for(int j=0;j<temp.length;j++){ // t4.insert(temp[j]); // } // } // et = System.currentTimeMillis(); // t4.print("T1多线程总用时:"+(et-st)+"ms\n"); // t4.printResult(); // t.print("下面多线程方法开始计算\n"); // st = System.currentTimeMillis(); // Top100Thread[] threads = new Top100Thread[2]; // //下面准备用10个线程分别计算 // for(int i=0;i<2;i++){ // threads[i] = new Top100Thread(true,test,i*50000000,i*50000000+50000000); // threads[i].start(); // } // for(int i=0;i<2;i++){ // try { // threads[i].join();//尝试等待10个线程完毕 // } catch (InterruptedException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // } // //下面将10个线程的10×100数字集合起来选出top100 // // T2 t4 = new T2(true); // int[] temp = null; // for(int i=0;i<2;i++){ // temp = threads[i].getTop100(); // for(int j=0;j<temp.length;j++){ // t4.insert2(temp[j]); // } // } // et = System.currentTimeMillis(); // t4.print("T2多线程总用时:"+(et-st)+"ms\n"); // t4.printLinkResult(); } }
T2.java;维持top100数据
package ddd; public class T2 { private int[] data = new int[100];//最大的100个数字 private LinkNode sdata = null; public T2(){ } public T2(boolean linked){ sdata = new LinkNode(Integer.MIN_VALUE); } public static void print(Object obj){ System.out.print(obj); } public void insert(int a){ //维持数组从大到小排序 for(int i=0;i<data.length;i++){ if(a>data[i]){//a放到data[i].同时i开始到100,后移 for(int j=data.length -1 ;j>i;j--){ data[j] = data[j-1]; } data[i] = a; break; } } //printResult(); } public void insert1(int a){ //因为数组已经是从大到小排序,因此从尾部到头部开始,大的插入,小的话则继续 if(a < data[data.length - 1]) return;//比最小的还小则退出 for(int i =0;i<data.length; i++){ if(a > data[i]){ for(int j=data.length -1 ;j>i;j--){ data[j] = data[j-1]; } data[i] = a; break; } } } public void insert2(int a){//linkNode插入 LinkNode t = sdata; LinkNode pre = null; int idx = 0; while(t!= null){ idx++; if(idx >= 100){ t.setNext(null); break; } if(a > t.getData()){ LinkNode temp = new LinkNode(a); temp.setNext(t); if(sdata == t)sdata = temp; if(pre != null)pre.setNext(temp); //printLinkResult(); break; } pre = t; t = t.getNext(); //printLinkResult(); } } public void printResult(){ for(int i=0;i<data.length;i++)print(data[i]+" "); print("\n"); } public void printLinkResult(){ LinkNode t = sdata; while(t!= null){ print(t.getData()+" "); t = t.getNext(); } print("\n"); } public int[] getData() { return data; } public int[] getLinkData() { LinkNode t = sdata; int i = 0; while(t!= null){ data[i++] = t.getData(); t = t.getNext(); } return data; } }
LinkNode.java:链表
package ddd; public class LinkNode { private int data; private LinkNode next; public LinkNode(int data) { this.data = data; this.next = null; } public LinkNode getNext() { return next; } public void setNext(LinkNode next) { this.next = next; } public int getData() { return data; } public void setData(int data) { this.data = data; } }
Top100Thread.java:多线程
package ddd; public class Top100Thread extends Thread { private int[] top100; private int sidx = 0; private int eidx = 0; private int[] data = null; private boolean linked = false; public Top100Thread(boolean linked,int[] d, int sidx, int eidx){ this.linked = linked; data = d; this.sidx = sidx; this.eidx = eidx; } public int[] getTop100() { return top100; } @Override public void run() { // TODO Auto-generated method stub super.run(); //从sidx到eidx中选取最大的100个数 if(this.linked){ T2 t = new T2(true); long st = System.currentTimeMillis(); for(int i= sidx;i<eidx;i++){ t.insert2(data[i]); } long et = System.currentTimeMillis(); t.print(this.getName()+"总用时:"+(et-st)+"ms\n"); t.printLinkResult(); this.top100 = t.getLinkData(); }else{ T2 t = new T2(); long st = System.currentTimeMillis(); for(int i= sidx;i<eidx;i++){ t.insert(data[i]); } long et = System.currentTimeMillis(); t.print(this.getName()+"总用时:"+(et-st)+"ms\n"); t.printResult(); this.top100 = t.getData(); } } }
发表评论
-
jdbc是否设置自动提交对性能的影响
2018-11-07 15:06 961项目中DB层会定时向mysql批量提交sql操作,之前是未设置 ... -
很久没写博客了
2018-10-27 10:30 2先激活下,有将近4年没有写实质性的博客内容了,这几年发生了很多 ... -
两年的项目开发一点小心得(二)
2013-06-20 23:31 903接着昨天 ... -
两年的项目开发一点小心得
2013-06-20 00:38 869从11年8月份 ... -
解决NSData中非法utf-8字节的问题
2012-05-13 13:12 4914当用nsdata,按照utf8编码来初始化nsstr ... -
练练手,用mina2.0搭建一个nio客户端
2012-05-08 16:03 6660练练手,用mina2.0搭建一个nio客户端,连接服务器。 ... -
android网络连接Wifi和cmnet及cmwap的问题
2011-10-27 23:43 4501困扰了我很久的,android ,http client无法直 ... -
C++学习小记
2011-07-05 23:23 1047很久没有写技术博客了,年后过来没有多少编程的工作, ... -
Java解惑读书笔记2
2011-05-07 11:10 1323从网上下的java解惑总共讲了61点,我拣一些,自己不知道的或 ... -
Java解惑读书笔记1
2011-05-07 10:14 10831。奇偶判断,应该用i%2 ... -
mongodb中mapreduce应该注意的问题
2011-03-15 14:46 1766今天用mongodb统计,老是出错误,在反复改和看官网文档后, ... -
如何计算一定的成功几率的结果
2010-12-15 11:37 973如何计算一定的成功几率的结果 经常遇到比如50%的成功概率,求 ... -
Mongodb如何保持数据正确更新
2010-11-29 15:26 2019Mongodb如何保持数据正确更新 所谓数据正确更新,就是在 ... -
自己开发的eclipse插件-生成java pojo字段名称
2010-11-25 14:20 2499自己开发的eclipse插件-生成java pojo字段名称 ... -
base64编码的java实现
2010-11-11 16:00 1682base64编码的java实现 虽然有现成的库,自己也写了个 ... -
人人网小小战争辅助工具分析
2010-11-05 11:38 23128人人网小小战争辅助工具分析 话说,闲的会蛋疼。过不是,最近无 ... -
Eclipse环境下的新浪微博插件
2010-11-03 22:36 3542E博,Eclipse下的新浪微博插件。 业余时间开发的,已经实 ... -
webqq2协议分析和qq聊天机器人简单实现
2010-11-02 16:51 22933webqq2协议分析和qq聊天机器人简单实现 通过webqq ... -
随便写个Http Web Server 玩玩,当然是简单的。只能查看文件
2010-08-26 17:37 1214不说话,直接上代码: import java.io.Buff ... -
自定义jstl标签在resin下出错解决办法
2010-05-29 13:37 1255web.xml还是 <web-app version=& ...
相关推荐
从一亿个数中找出最大的100个 或者n个 用了个堆从一亿个数中找出最大的100个 或者n个 用了个堆
首先,我们可以想到的方法是建立一个数组把1亿个数装起来,然后用for循环遍历这个数组,找出最大的1万个数来。这种方法的时间复杂度为O(n*m),其中n是数组的大小,m是要找出的最大数的个数。然而,这种方法的运行...
从一亿个数据里找前N个最大的数----算法源码,这里仅是思路之一的源码,更多详解和思路,请查看: 个人博客:http://blog.csdn.net/yanzi1225627 或:http://www.eyeandroid.com/thread-9596-1-1.html
本文将探讨如何使用分治策略来解决一个特定的问题——在一个包含n个整数的数组中找到第二大的元素。 #### 分治算法原理 分治(Divide and Conquer)是一种重要的算法设计策略,它通过递归地将一个问题分解成两个或...
在这个场景中,我们需要从一亿个数字中快速找出前100个最小的数字。这通常涉及到排序算法和数据结构的运用,以达到在短时间内找到目标结果。以下是实现这个任务的一些关键知识点: 1. **优先队列(Priority Queue)...
在编程领域,鞍点(Saddle Point)是指在一个矩阵中,某个元素在同一行中最大,同时在同一列中最小。这是一个相对特殊的位置,因为通常我们关注的是最大值或最小值,而鞍点则结合了这两种特性。在Java编程中,解决这...
很基础的一维 数组操作,初学者可以看一下,毕竟也是我初学的时候编的
通过这样的方式,我们可以有效地解决C语言中的TOP-K问题,即使在大量数据中也能高效地找出最大的k个数或最小的k个数。在压缩包中的"Heap"文件中,可能包含了具体的代码实现和其他相关示例,进一步详细展示了如何在...
编写一个在具有m行n列的二维数组各元素中找出最大元和最小元并显示在屏幕上的函数模板,并通过主函数对它进行调用以验证其正确性。例如,可设计该函数模板的原型为: template <class Type> void maxMin (Type *A,...
本主题将深入探讨如何使用C++语言来实现一个算法,该算法能够找出两个字符串中的最大公共子串。公共子串是指同时存在于两个或多个字符串中的任意非空字符序列。在本问题中,我们目标是找到最长的这样一个子串。 ...
在C语言中,找出数组中的最大值和最小值是一项常见的任务,这有助于理解和掌握基本的循环、条件判断以及数组操作。下面将详细解释这个程序的工作原理及其涉及的关键知识点。 首先,程序通过`#include<stdio.h>`引入...
这段代码实现了一个名为`GetResult`的函数,其功能是找出一个整数数组中连续递增子序列最长的长度,并返回该序列的起始位置和长度。具体来说: ```cpp int C SerdesAnalyseDlg::GetResult(int *nData, int nCount) ...
下面是一个简单的C语言代码示例,用于找出数组中的最小值: ```c #include #define SIZE 10 // 假设数组大小为10 int find_min(int arr[], int n) { int min_val = arr[0]; // 初始化最小值为数组第一个元素 ...
在TIA博途中,利用MAX和MIN数学函数可以轻松地找出一组变量中的最大值和最小值,这对于数据处理和分析非常有用。以下是如何在TIA博途中操作这些函数的详细步骤: 1. 首先,创建一个新的项目。在TIA博途软件中,选择...
微机原理与接口技术实验 以buff开始的内存单元中有10个有符号数(字节型): -37、28、-115、-2、98、-100、93、120、56、-99 请编写程序找出最大的数存入MAX单元中,同时也找出最小的数存入MIN单元中。
最后,我们需要找出最大值和最小值对应的数组下标。由于我们已经遍历了整个数组,所以在找到最大值和最小值时,可以直接记录它们的下标。为了简洁起见,我们可以用`find`函数配合`std::distance`来实现: ```cpp ...
C语言程序设计-编写程序。...⑴求出这8个数据的和、最大值、最小值及平均值。 ⑵求这8个数据的正数之和、负数之和(或正数与负数的个数); ⑶求这8个数据的奇数之和、偶数之和(或奇数与偶数的个数)。
本程序可以高效的实现对excel数据中多个相同的x值对应的y值不同情况下求得所有x对应的y的最大值,并且不会重复显示,相比与用excel的矩阵运算处理时需要占用大量CPU资源和计算时间长久,本方法在面对大量数据情况下...