一些简单的算法
2016-03-29 11:41
169 查看
**1. 入门算法冒泡排序时间复杂度o(n²),空间复杂度o(1),最差的排序。
2. 快速排序,快速排序(Quicksort)是对冒泡排序的一种改进,排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想—-分治法也确实实用,方法的基本思想是:**
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
**3. 100万个数中找最大或最小,设临时变量赋值为数组中第一个元素值,遍历数组遇到大于变量的值,就替换变量的值,然后继续比较。循环一次搞定,时间复杂度为o(n-1)。
4. 100个人羽毛球比赛,挑出水平最高的人,最少比赛n-1场,两两比赛,决出水平高的,再两两比,最后决出胜负。这样他的时间复杂度就是o(n-1),但是在两两比赛的时候,只要有足够的场地,比赛可以同时进行,总体时间就节省下来了,在计算机中就是“多线程技术”,对“问题3”的更优解。
5. 100万个数中 找最大的10个?最小堆的思维,取10个数,迭代数组,只与10个数中最小的数比较,当比最小数大时替换,维护10个数的排序,继续比较,最差的情况就是运算10*100万次。
6. 关于排序,实际场景很重要,杂乱无章的大数据,如果是一定范围类均匀分布,则可用堆排序,如200万个数据,分2000份甚至更多,【1-1000】,【1001-2000】。。。每个区间的数据范围是一小堆,小堆之间是有序的,,因此只要堆的内部有序,就是全局有序了,这个过程需要扫描200万数据一次,因为堆是有序的,采用二分法,可以快速定位自己的堆(每次匹配范围缩小一倍),每个堆自己排序,用多线程来降低计算时间。扩展出来,这就是分布式计算的原理了。
7. hash算法,hash算法有很多种,基本原理是先分班,hashcode定位班级,在班级里找人。**
2. 快速排序,快速排序(Quicksort)是对冒泡排序的一种改进,排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想—-分治法也确实实用,方法的基本思想是:**
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
public class QuikSort { /** * @param args */ public static void main(String[] args) { int s[]={2,1,4,61,7,5,1}; quick_sort(s, 0, s.length-1); for(int i :s){ System.out.print(i+","); } } /** * 快速排序 * @param 待排序数组 * @param l 左边界索引 * @param r 右边界索引 */ public static void quick_sort(int s[], int l, int r) { if (l < r) //由此判断停止递归调用,递归后最终r会小于l { int i=l,j=r,pos=s[l]; while(i<j){ while(i<j&&s[j]>=pos){ j--; } if(i<j){ s[i++]=s[j];//将右边比pos大的数赋给左边 } while(i<j&&s[i]<=pos){ i++; } if(i<j){ s[j--]=s[i];//将左边比pos小的数赋给上面得出的右边比pos大的数 } }//直到i==j,得出pos最终的位置,左边的数都比pos小,右边的都大 s[i]=pos;//将pos放回位置上。 quick_sort(s,l,i-1);//递归当前pos位置的左边 quick_sort(s,i+1,r);//递归当前pos位置的右边 } } }
**3. 100万个数中找最大或最小,设临时变量赋值为数组中第一个元素值,遍历数组遇到大于变量的值,就替换变量的值,然后继续比较。循环一次搞定,时间复杂度为o(n-1)。
4. 100个人羽毛球比赛,挑出水平最高的人,最少比赛n-1场,两两比赛,决出水平高的,再两两比,最后决出胜负。这样他的时间复杂度就是o(n-1),但是在两两比赛的时候,只要有足够的场地,比赛可以同时进行,总体时间就节省下来了,在计算机中就是“多线程技术”,对“问题3”的更优解。
5. 100万个数中 找最大的10个?最小堆的思维,取10个数,迭代数组,只与10个数中最小的数比较,当比最小数大时替换,维护10个数的排序,继续比较,最差的情况就是运算10*100万次。
6. 关于排序,实际场景很重要,杂乱无章的大数据,如果是一定范围类均匀分布,则可用堆排序,如200万个数据,分2000份甚至更多,【1-1000】,【1001-2000】。。。每个区间的数据范围是一小堆,小堆之间是有序的,,因此只要堆的内部有序,就是全局有序了,这个过程需要扫描200万数据一次,因为堆是有序的,采用二分法,可以快速定位自己的堆(每次匹配范围缩小一倍),每个堆自己排序,用多线程来降低计算时间。扩展出来,这就是分布式计算的原理了。
7. hash算法,hash算法有很多种,基本原理是先分班,hashcode定位班级,在班级里找人。**
相关文章推荐
- 职业规划
- 关于HTTP详解
- 七.文件阅读的命令
- Java中Random类的nextInt()方法详解
- jsp 打印
- 七步从AngularJS菜鸟到专家(4和5):指令和表达式
- qt中的tcp编程
- ASIFormDataRequest实现post的代码示例
- HTTP/2 对 Web 性能的影响(下)
- HTTP/2 对 Web 性能的影响(下)
- 剑指offer-面试题15:链表中倒数第K个结点
- Windows下C语言的Socket编程例子(TCP和UDP)
- T-SQL 使用WITH高效分页
- Nginx配置文件
- DeepId人脸识别算法学习
- 六.线上查询的命令
- Apple官方例子代码地址
- 修改select样式
- jquery autocomplete
- 七步从Angular.JS菜鸟到专家(3):数据绑定和AJAX