算法复习

 

第一部分 数据结构

https://www.jianshu.com/p/230e6fde9c75

http://blog.csdn.net/u011240877/article/details/53193877

数据结构:数据的逻辑结构、数据的物理存储结构、对数据的操作(算法

4种逻辑结构:

  1. 集合 同属一个集合,别无其他关系
  2. 线性结构:一对一
  3. 树型结构:一对多
  4. 图形结构:多对多

2种存储结构:

  1. 顺序存储结构
  2. 链式存储结构
    1. 线性表
      n个数据元素的有限序列,常见的线性表有数组和链表
      按顺序存储的 顺序表:存储区间连续,占用内存严重,寻址容易,增删都需要移动其他元素的位置,如数组
      按链式存储的 链表 存储区间离散,通过前驱、后继跟其他元素关联;增删只需要改变他前后元素的前驱和后继就行、但寻址困难
    2. 栈、队列
      逻辑结构都是线性结构
      栈:只能在表的一端增删  pop()出栈   push()进栈
      队列:一端增、另一端删

    3. 树是一对多,最多一个根节点,每个孩子节点都只有一个父节点
      二叉树:每个子节点最多只能有两个子节点(左子树、右子树)
    4. 哈希表
      综合了数组和链表的特性,寻址容易,增删也容易,以空间换时间
      根据关键码值(Key value)存取数据

      通过一个固定的哈希函数把key转换成一个整型数字,作数组的下标,把value存储在相应数组空间里

    5. 哈希表与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-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     }    

     

  3. 插入排序
     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     }

     

  4. 求M 和N的最大公约数 

  5. 递归
     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     }

     

  6. 金额转换 如1010 壹仟零壹拾元
    View Code

     

 

posted on 2018-02-04 00:39  CoDeiSlifE  阅读(138)  评论(0编辑  收藏  举报