2019-04-14

一: 数据结构和算法

前言:今天内容主要是了解数据结构和算法的一些基础概念,重点找掌握
大O计数法(重点)、排序算法、查找算法。

  • 你需要掌握的技术:
    • Java和Python的简单语法规则
    • Java的面向对象<加分>
    • Java和Python中的一些常见集合

前置学习条件

数据结构的作用?

底层存储数据的方式,数据结构的选取直接决定了数据的CRUD的优缺点。
应对于不同的应用和需求场景。

算法的作用?

算法就是将已知的结构,通过有限的步骤获取到一个或者多个输出结果。
(输入、输出、确定、可行、有穷)

数据结构和算法的关系?

数据结构就是为算法提供服务的,算法是围绕数据结构展开操作的。
不同的数据结构底层存储方式不同、不同的存储方式选择不同的算法完成操作。
单纯想要通过算法解决一个问题是不现实的,算法是在数据结构的基础上建立起来的。

如何评价一个算法是否优秀?

时间复杂度:重点
空间复杂度:
固定空间内存 (代码、常数、变量) 通过集合迭代
变动空间内存 程序随着时间的推延,某个对象(引用类型)变得极为臃肿。

1-1 大O计数法

1:什么是大O计数法
2: 规则:
    * 加法规则
    * 乘法规则
    * 均摊复杂度
    * 常见复杂度分析

1-1-1 : 什么是大O计数法(big notation)

T(n)=O(f(n))

T(n)当前算法的执行时间

n 当前数据的规模大小

f(n) 每行代码执行次数的总和,是一个公式

O 代表的代码的执行时间T(n)和f(n) 成正比的。

大O计数法的推导过程

一行代码的执行过程分为:取值->译码->执行。假设一行代码的执行时间是一个
Unit_Time,虽然cpu的个数不同,执行时间不同,但是我们可以粗略的认为是一致的。
写一些测试用例:

测试用例1:

int num1 = 10;
int num2 = 20;
int totle = num1+num2;
System.out.println(totle);

当前这个程序的执行时间是4Unit_Time。

测试用例2:

int totle = 0;
for(int i = 1;i<=100;i++){
    totle += i;
}
System.out.println(totle);

当前这个程序的执行时间是(2N+2)*Unit_Time。
所有代码的执行时间T(n)和每行代码的执行次数成正比关系。

测试用例3:

System.out.println("打印久久乘法表");
for(int i = 1;i<=9;i++){
    for(int j = 1;j<=i;j++){
       System.out.println(i+"*"+j+"="+(i*j)+"\t"); 
    }
    System.out.println();
}

当前这个程序的执行时间是Unit_Time+nUnit_Time+n^2Unit_Time。

随着数据规模的不断增大,可以忽略常数项和系数。
所以一般情况下我们关注的时间复杂度都是关注循环次数最多的那一段代码即可。

规则

* 加法规则(找到循环次数最多的)
* 乘法规则(多次循环)
* 平均复杂度分析(查找的元素的概率/查找的次数)

常见算法

排序算法

冒泡排序

两两元素进行互相比较,一直比较到最后一个数,那么这样一趟下来,最大的一个数字就在
最后,或者是最小的数字在最后。(看程序编写的思路,如果是前一个元素比后一个元素大,互换位置,
那么就是最大元素在最后,如果是前一个元素比后一个元素小,互换位置,那么最后一个元素就是最小元素)。

持续到第二次再进行两两元素比较,确定第二大或者是第二小的数

持续以上步骤,知道整个数组都排序完成。

一般编写

public static void bubbleSort01(int[] arrs){
    for(int i = 0;i<arrs.length;i++){//确定趟数
        System.out.println("第"+(i+1)+"趟");
        for(int j = 0;j<arrs.length-1;j++){//次数
            //比较是否交换
            if(arrs[j]>arrs[j+1]){
                int temp = arrs[j];
                arrs[j] = arrs[j+1];
                arrs[j+1] = temp;
            }

            System.out.println("第"+(j+1)+"次");
            System.out.println(Arrays.toString(arrs));//Arrays中的方法 可以将数组中的元素迭代出来
        }
    }
}

减少次数

public static void bubbleSort02(int[] arrs){
    for(int i = 0;i<arrs.length;i++){//确定趟数
        System.out.println("第"+(i+1)+"趟");
        for(int j = 0;j<arrs.length-1-i;j++){//次数
            //比较是否交换
            if(arrs[j]>arrs[j+1]){
                int temp = arrs[j];
                arrs[j] = arrs[j+1];
                arrs[j+1] = temp;
            }
            System.out.println("第"+(j+1)+"次");
            System.out.println(Arrays.toString(arrs));//Arrays中的方法 可以将数组中的元素迭代出来
        }
    }
}

减少趟数

public static void bubbleSort03(int[] arrs){
    for(int i = 0;i<arrs.length;i++){//确定趟数
        System.out.println("第"+(i+1)+"趟");
        boolean flag = false;
        for(int j = 0;j<arrs.length-1-i;j++){//次数
            //比较是否交换
            if(arrs[j]>arrs[j+1]){
                int temp = arrs[j];
                arrs[j] = arrs[j+1];
                arrs[j+1] = temp;
                flag = true;
            }

            System.out.println("第"+(j+1)+"次");
            System.out.println(Arrays.toString(arrs));//Arrays中的方法 可以将数组中的元素迭代出来
        }
        //判定一些flag的值
        if(!flag){
            return;//跳出整个循环 不做了
        }
    }
}

选择

用第一个元素依次和所有元素进行比较,如果存在比当前第一个元素小的值,则记录位置。
整个一次比较过程中,确定了最大或者是最小元素的索引。
总共比较lenght-1次,每一次都会确定一个最小元素

public static void selectSort(int[] arrs){
    // 先对于arrs进行判定
    for(int i = 0;i<arrs.length-1;i++){
        int index = i;//记录 假设i索引是最小元素
        for(int j = i+1;j<arrs.length;j++){
            if(arrs[index]>arrs[j]){
                index = j;
            }
        }

        if(index!=i){
            int temp = arrs[i];
            arrs[i] = arrs[index];
            arrs[index] = temp;
        }

    }

}

查找算法:

** 二分查找法(折半查找)**

保证数组有序的前提下,包含最小索引min(0),最大索引(max)。
min<=max前提下,不断求中间索引(mid)的的值,mid=(min+max)/2
根据每次mid的索引对应的值和要查找的元素进行对比,如果
arrs[mid]>value 在mid的左侧,min不动,max=mid-1
arrs[mid]<value 在mid的右侧,max不动,min=mid+1
arrs[mid]=value 证明找到了

min>max 证明没有找到

/**
     * 通过二分查找法 查找元素
     * @param arrs 数组
     * @param value 值
     * @return 索引 如果存在分返回对应的索引 如果不存在 返回-1
     */
public static int binearySearch(int[] arrs,int value){
     int max = arrs.length-1;
     int min = 0;
     int mid ;
 
     while(max>=min){
         //计算中间索引
         mid = (max+min)/2;
         if(arrs[mid]>value){//在左侧
             //移动max
             max = mid-1;
         }else if(arrs[mid]<value){//
             min = mid+1;
         }else{
             return mid;
         }
     }
     return -1;
 }

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 223,924评论 6 521
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 95,776评论 3 402
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 170,954评论 0 366
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,576评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 69,589评论 6 399
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,105评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,480评论 3 427
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,457评论 0 278
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,998评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,026评论 3 343
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,174评论 1 354
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,812评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,502评论 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,979评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,101评论 1 275
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,674评论 3 380
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,204评论 2 363

推荐阅读更多精彩内容