分治与递归——找出数组中重复最多的元素算

本文详细介绍了使用快速排序辅助查找数组中重复次数最多的元素的方法,包括了时间复杂度分析和不同查找策略的时间比较。通过实验数据展示了在不同数据量和重复元素数量下的性能表现。
//找出数组中重复次数最多的元素并打印

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map.Entry;



import commons.algorithm.sort.QuickSort;





public class Problem_3 {



//先快速排序后循环查找 O( n*log2(n) + n )

public static void find1(int[] arr){



QuickSort.sort(arr);





int max = arr[0];

int pre=1;

int now=1;



for(int i=0;i<(arr.length-1);i++){



if(arr[i]==arr[i+1])

now++;

else {

if(now>=pre){

pre=now;

now=1;

max=arr[i];

}

}

}







}



//嵌套循环查找 O(n*n)

public static void find2(int[] arr){





int pre=0;

int max=arr[0];



for(int i=0;i<arr.length;i++){

int now=0;

for(int j=0;j<arr.length;j++){



if(arr[i]==arr[j]) {

now++;

}

}



if(now>=pre){

max=arr[i];

pre=now;

}





}







}



//通过 Hash 方式

public static void find3(int[] arr){

HashMap<Integer,Integer> hm=new HashMap<Integer, Integer>();

for(int i=0;i<arr.length;i++){

if(hm.containsKey(arr[i])) {

int count=hm.get(arr[i]);

hm.put(arr[i], ++count);



}else{

hm.put(arr[i],1);

}

}



Iterator<Entry<Integer, Integer>> it=hm.entrySet().iterator();

int pre=0;

int max=arr[0];

while(it.hasNext()) {

Entry<Integer, Integer> en=it.next();

int key=en.getKey();

int val=en.getValue();

if(val>pre){

pre=val;

max=key;

}



}







}

public static void main(String args[]){



//数据量800 重复元素多,查找时候分别是: 46 3680 195

int arr2[]={0,1,2, .....

,0,1,2,3,6,7,8,9};



//数据量800 重复元素少,查找时间分别是 82 3727 360

int arr[]={0,0,0,11,12,13,14,5,6 ......

,51,52,53,,728,29,730,731,3,794,95,796,797,798,799};







long start,end;



start=System.currentTimeMillis();

for(int i=0;i<1000;i++) find1(arr);

end=System.currentTimeMillis();

System.out.println(end-start);



start=System.currentTimeMillis();

for(int i=0;i<1000;i++) find2(arr);

end=System.currentTimeMillis();

System.out.println(end-start);





start=System.currentTimeMillis();

for(int i=0;i<1000;i++) find3(arr);

end=System.currentTimeMillis();

System.out.println(end-start);



}
/*问题描述:一辆汽车加满油后可行驶nkm ,旅途中有若干个加油站,设计一个有效的法, * 指出应在哪些加油站停靠加油,使沿途加油次数最少。 *法设计:对于给定的n和k个加油站位置,计最少加油次数。 * 数据输入;由文件input.txt给出输入数据。第一行有2个正整数n和k, * 表示汽车加油后可以行驶的nkm,且旅途中有k个加油站, * 接下来的一行中有k+1个整数,表示第k个加油站k-1个加油站之间的距离, * 第0个加油站表示出发地,汽车已加满油。第k+1个加油站表示目的地, *结果输出:将计的最少加油次数输出到文件output.txt * 如果无法到达目的地则输出”no solution“. * 输入文件示例: 输出文件示例: * input.txt output.txt * 7 7 4 * 1 2 3 4 5 1 6 6 部分代码: void greedy(int d[],int n,int k) { int num = 0; int i=0; int s=0; for( i = 0;i n) { //当任意的两个加油站之间的距离大于了汽车的最大行驶距离N cout<<"no solution\n"<<endl; return; } } for( i = 0,s = 0;i n) { num++; s = d[i]; cout<<"加油的站点为: "<<i<<endl<<endl; } cout<<"s="<<s<<" "; cout<<"number="<<num<<endl<<endl; } cout<<"最终加油次数为:"<<num<<endl; } /* 运行结果: * 请输入汽车可行驶: * 7 * * 加油站的个数: * 7 * * 请输入各个站点之间的距离 * * 第0到1站点的距离为: * 1 * 第1到2站点的距离为: * 2 * 第2到3站点的距离为: * 3 * 第3到4站点的距离为: * 4 * 第4到5站点的距离为: * 5 * 第5到6站点的距离为: * 1 * 第6到7站点的距离为: * 6 * 第7到8站点的距离为: * 6 * s=1 number=0 * * s=3 number=0 * * s=6 number=0 * * 加油的站点为: 3 * * s=4 number=1 * * 加油的站点为: 4 * * s=5 number=2 * * s=6 number=2 * * 加油的站点为: 6 * * s=6 number=3 * * 加油的站点为: 7 * * s=6 number=4 * * 最终加油次数为:4 * 请按任意键继续. . . * *
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值