//找出数组中重复次数最多的元素并打印
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);
}
分享到:
相关推荐
利用分治法快速而有效的求出任意数组的最大值与最小值。 编码用C++实现
算法思想——递归与分治 算法思想——递归与分治
递归求数组最大最小元素。
用递归算法编写求一个数组A中的最大元素;/****一个递归算法,求数组A中最大的元素***/ #include int Max(int A[], int i, int j) //求顺序表A中的最大元素 ……
深入理解分治法的算法思想,应用分治法解决实际的算法问题。 【实验性质】 验证性实验(学时数:2H) 【实验内容与要求】 1、设有n=2k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表:⑴每个选手...
用php递归将二维数组转换成一维数组 php基础
递归打印数组和找出最小数(C语言) 递归打印数组和找出最小数(C语言)
常规的做法是遍历一次,分别求出最大值和最小值,但我这里要说的是分治法,将数组分成左右两部分,先求出左半部份的最大值和最小值,再求出右半部份的最大值和最小值,然后综合起来求总体的最大值及最小值。...
分治思想:将难以直接求解的大问题分解为k个相同的子问题;对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止;
详细介绍了分治与递归算法。 递归算法的执行过程分为递推和回归两个阶段。 在递归阶段,把较为复杂的问题(如规模为n)的求解推到比原来问题简单一些的问题(规模小于n)的求解 在回归阶段,当获得最简单情况的节后...
谈到找数组中最大元素的问题,很多人第一个感觉就是排序,然后第一个或者最后一个就是的,其实在一个尚未排序的数组中也可以实现--通过递归!
算法面试通关40讲完整课件 22-24 分治、递归、回溯 算法面试通关40讲完整课件 22-24 分治、递归、回溯 算法面试通关40讲完整课件 22-24 分治、递归、回溯 算法面试通关40讲完整课件 22-24 分治、递归、回溯 算法面试...
递归与分治实验(二)Problem A:再次Hanoi塔问题Problem B:输油管道问题Problem C:Integer FactorizationProblem D:邮局选址问题Problem E:Gray code
js代码-第1天 用递归算法实现,数组长度为5且元素的随机数在2-32间不重复的值
利用递归方法求给定整型数组中的最大元素。 样例输入: 8 223 112 412 123 51 987 98 793 988 样例输出: 988
该料详细介绍了算法中的一种典型思想———递归与分治
C++长训基础@递归——拓展.pdf
对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止
求数组的子数组之和的最大值,数组中全部为整数,子数组之和即为连续的数组元素相加之和
c语言分治法求众数重数-五大常见算法策略之——递归与分治策略,算法数据结构 五大常用算法