第一部分 数据结构
https://www.jianshu.com/p/230e6fde9c75
http://blog.csdn.net/u011240877/article/details/53193877
数据结构:数据的逻辑结构、数据的物理存储结构、对数据的操作(算法)
4种逻辑结构:
- 集合 同属一个集合,别无其他关系
- 线性结构:一对一
- 树型结构:一对多
- 图形结构:多对多
2种存储结构:
- 顺序存储结构
- 链式存储结构
- 线性表
n个数据元素的有限序列,常见的线性表有数组和链表
按顺序存储的 顺序表:存储区间连续,占用内存严重,寻址容易,增删都需要移动其他元素的位置,如数组
按链式存储的 链表 存储区间离散,通过前驱、后继跟其他元素关联;增删只需要改变他前后元素的前驱和后继就行、但寻址困难 - 栈、队列
逻辑结构都是线性结构
栈:只能在表的一端增删 pop()出栈 push()进栈
队列:一端增、另一端删 - 树
树是一对多,最多一个根节点,每个孩子节点都只有一个父节点
二叉树:每个子节点最多只能有两个子节点(左子树、右子树) - 图
- 哈希表
综合了数组和链表的特性,寻址容易,增删也容易,以空间换时间
根据关键码值(Key value)存取数据
通过一个固定的哈希函数把key转换成一个整型数字,作数组的下标,把value存储在相应数组空间里
- 哈希表与hashcode
hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括HashSet、HashMap以及HashTable。
当集合要添加新的对象时,先调用这个对象的hashCode方法,得到对应的hashcode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode值,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了;如果存在该hashcode值,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址,所以这里存在一个冲突解决的问题,这样一来实际调用equals方法的次数就大大降低了,说通俗一点:Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。put方法是用来向HashMap中添加新的元素,从put方法的具体实现可知,会先调用hashCode方法得到该元素的hashCode值,然后查看table中是否存在该hashCode值,如果存在则调用equals方法重新确定是否存在该元素,如果存在,则更新value值,否则将新的元素添加到HashMap中。从这里可以看出,hashCode方法的存在是为了减少equals方法的调用次数,从而提高程序效率
第二部分 算法
算法设计
- 穷举法
- 分治法
- 动态规划法
- 贪婪算法
- 线性规划法
算法实现
- 一般方法
- 递归方法
- 迭代方法
- 数组复制
- 冒泡排序
1 /** 2 * 1-2 、1-3 3 * 2-3、2-4、... 4 */ 5 public static void mppx(int[]a){ 6 for(int i=0;i<a.length-1;i++){ 7 for(int j=i+1;j<a.length;j++){ 8 if(a[i]>a[j]){ 9 int temp =a[i]; 10 a[i]=a[j]; 11 a[j]=temp; 12 } 13 } 14 } 15 }
- 插入排序
1 public static void px(int[] a) { 2 for (int i = 1; i < a.length; i++) { 3 if (a[i] < a[i - 1]) { 4 int temp = a[i]; 5 int j; 6 for (j = i - 1; j >= 0 && a[j] > temp; j--) { 7 a[j + 1] = a[j]; 8 } 9 a[j + 1] = temp; 10 } 11 } 12 }
-
求M 和N的最大公约数
- 递归
1 //99+98+...+1 2 public static int add(int a){ 3 if(a==1){ 4 return a; 5 } 6 return a+add(--a); 7 } 8 //第一个人10岁,第二个比第一个大2岁。。。 9 public static int computeAge(int n) 10 { 11 if(n==1) return 10; 12 return computeAge(n-1) + 2; 13 }
- 金额转换 如1010 壹仟零壹拾元
View Code