• 算法复习


    第一部分 数据结构

    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
  • 相关阅读:
    C++11——Lambda表达式
    匿名空间使用
    C++11——可调用对象包装器、绑定器
    winhttp 发送https的get请求
    C++11——基于范围的for循环
    C++11——列表初始化
    C++11——委托构造和继承构造函数
    C++11——using的使用
    使用appnium,Uiautomatorviewer连接手机报错:Unexpected error while obtaining UI hierarchy java.lang.reflect.Invocation【已解决】
    逆向 | IATHook 全屏加速挂
  • 原文地址:https://www.cnblogs.com/gucl/p/8411579.html
Copyright © 2020-2023  润新知