模块二十二_数据结构与算法

序言:

文章内容输出来源:拉勾教育Java高薪训练营。
本篇文章是学习课程中的一部分课后笔记

一、数据结构与算法概述

1. 什么是数据结构

数据结构(data structure)是计算机存储、组织数据的方式。
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
一句话解释:存数据的,而且是在内存中存!

2. 常见的数据结构
image.png
3. 什么是算法

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。
一句话描述:算法是一种解决特定问题的思路
比如:LRU算法,最近最少使用,解决的就是当空间不够用时,应该淘汰谁的问题,这是一种策略,不是唯一的答案,所以算法无对错,只有好和不好。

4. 常见算法
image.png
5. 算法复杂度

数据结构和算法本质上是”快“和"省";
所以代码的执行效率是非常重要的度量。

5.1 时间复杂度
常见的时间复杂度:

  • O(1)
    常量级,代码的执行不随着数据规模(n)的增加而增加,
    在实际应用中,通常使用冗余字段存储来将O(n)变成O(1),比如Redis中有很多这样的操作用来提升访问性能 , 比如:SDS、字典、跳跃表等

  • O(logn)、O(nlogn)

i = 1; 
while(i <= n)
{ 
i = i * 2;// 执行最多
 }

2^x =n
x=log n
忽略系数为logn
T(n)=O(logn)
如果将该代码执行n遍,则时间复杂度记录为:T(n)=O(n*logn),即O(nlogn)
快速排序、归并排序的时间复杂度都是O(nlogn)

  • O(n)
int sum(int n){
   int s=0; //t 
   int i=1; //t 
   for(;i<=n;i++){ //t*n
     s=s+i; //t*n
   }
   return s; //t 
}

t+t+t*n+t*n+t=2tn+3t

我们假设执行一行代码的时间为t,通过估算,代码的执行时间T(n)与执行次数成正比,记做: T(n)=O(f(n))

T(n): 代码执行时间
n:数据规模
f(n):每行代码执行次数总和
O:代码的执行时间与f(n)表达式成正比
上面的例子中的T(n)=O(2n+3),当n无限大时,低阶、常量、系统都可以忽略
所以T(n)=O(n)
即上例中的时间复杂度为O(n),也就是代码执行时间随着数据规模的增加而增长

比如:数组的插入删除、链表的遍历等

  • O(m+n)
    代码的时间复杂度由两个数据的规模来决定
int sum(int m,int n){ 
  int s1=0;
  int s2=0; 
  int i=1;
  int j=1;
  for(;i<=m;i++){
    s1=s1+i; // 执行最多
  }
  for(;j<=n;j++){ 
    s2=s2+j; //执行最多
  }
return s1+s2;
 }

m和n是代码的两个数据规模,而且不能确定谁更大,此时代码的复杂度为两段时间复杂度之和, 即 T(n)=O(m+n),记作:O(m+n)

  • O(m*n)
int sum(int m,int n){
   int s=0; 
   int i=1; 
   int j=1; 
   for(;i<=m;i++){// m
       j=1; 
       for(;j<=n;j++){ //m*n 
          s=s+i+j; //m*n 
       } 
   }
return s;
 }

根据乘法法则代码的复杂度为两段时间复杂度之积,即
T(n)=O(m×n),记作:O(m×n)
当m==n时,为O(n^2)

5.2 空间复杂度

  • 空间复杂度全称是渐进空间复杂度,表示算法的存储空间与数据规模之间的增长关系。
    比如将一个数组拷贝到另一个数组中,就是相当于空间扩大了一倍:T(n)=O(2n),忽略系数。即为:O(n),这是一个非常常见的空间复杂度,比如跳跃表、hashmap的扩容此外还有:O(1),比如原地排序、O(n ) 此种占用空间过大。
    由于现在硬件相对比较便宜,所以在开发中常常会利用空间来换时间,比如缓存技术典型的数据结构中空间换时间是:跳跃表

二、数据结构与算法概述

1. 线性表
  • 1.1 数组
    概念:
    数组(Array)是有限个相同类型的变量所组成的有序集合,数组中的每一个变量被称为元素。数组是最为简单、最为常用的数据结构。
    image.png

存储原理:
数组用一组连续的内存空间来存储一组具有相同类型的数据;

image.png

(模拟内存存储)
灰色格子:被使用的内存
橙色格子:空闲的内存
红色格子:数组占用的内存

数组可以根据下标随机访问数据
随机元素寻址
a[i]_address=a[0]_address+i*4
公式解释 : 连续性分配、相同的类型、下标从0开始

  • 1.2 链表
    概念:
    链表(linked list)是一种在物理上非连续、非顺序的数据结构,由若干节点(node)所组成。
    链表中数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。
    每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域
    存储原理:
    数组在内存中的存储方式是顺序存储(连续存储),链表在内存中的存储方式则是随机存储(链式存储)。
    链表的每一个节点分布在内存的不同位置,依靠next指针关联起来。这样可以灵活有效地利用零散的碎片空间。

    image.png

    链表的第1个节点被称为头节点(3),没有任何节点的next指针指向它,或者说它的前置节点为空头结点用来记录链表的基地址。有了它,我们就可以遍历得到整条链表链表的最后1个节点被称为尾节点(2),它指向的next为空。

  • 1.3 栈
    概念:
    栈(stack)是一种线性数据结构,栈中的元素只能先入后出(First In Last Out,简称FILO)。
    最早进入的元素存放的位置叫作栈底(bottom),最后进入的元素存放的位置叫作栈顶 (top)。

    image.png

存储原理:
用数组来实现 (顺序栈或静态栈
用链表来实现 (链式栈或动态栈
栈的数组实现如下:

image.png

栈的链表实现如下:
image.png

  • 1.4 队列
    概念:
    队列(queue)是一种线性数据结构,队列中的元素只能先入先出(First In First Out,简称 FIFO)。
    队列的出口端叫作队头(front),队列的入口端叫作队尾(rear)。
    image.png

存储原理:
用数组来实现 (顺序队列
用链表来实现 (链式队列
数组实现:

image.png

链表实现:


image.png
2. 散列表

概念:
散列表也叫作哈希表(hash table),这种数据结构提供了键(Key)和值(Value)的映射关系。只要给出一个Key,就可以高效查找到它所匹配的Value,时间复杂度接近于O(1)。

image.png

存储原理:
哈希函数
散列表在本质上也是一个数组;
散列表的Key则是以字符串类型为主的,通过hash函数把Key和数组下标进行转换作用是把任意长度的输入通过散列算法转换成固定类型、固定长度的散列值。

image.png

3. 递归

概念:
递归,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。也就是说,递归算法是一种直接或者间接调用自身函数或者方法的算法。

本质:
递归,去的过程叫"递",回来的过程叫”归“;
递是调用,归是结束后回来,是一种循环,而且在循环中执行的就是调用自己
递归调用将每次返回的结果存在栈帧中

  • 递归三要素:
    1、 递归结束条件
    既然是循环就必须要有结束,不结束就会OOM了
    2、函数的功能
    这个函数要干什么,打印,计算....
    3、函数的等价关系式
    递归公式,一般是每次执行之间,或者与个数之间的逻辑关系
4. 二分查找

概念:
二分查找(Binary Search)算法,也叫折半查找算法;
当我们要从一个序列中查找一个元素的时候,二分查找是一种非常快速的查找算法
二分查找是针对有序数据集合的查找算法,如果是无序数据集合就遍历查找。

image.png

本质:
二分查找之所以快速,是因为它在匹配不成功的时候,每次都能排除剩余元素中一半的元素。因此可能包含目标元素的有效范围就收缩得很快,而不像顺序查找那样,每次仅能排除一个元素。

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

推荐阅读更多精彩内容