数据结构

目录

导读

时间复杂度

常见的大O运行时间

二叉树

二叉树的遍历

数组和链表

数组

链表

数据结构中的堆和栈、队列

队列

 其它


导读

每种数据结构都相当于一种容器,我们把数据放在里面后供我们高效地操作这些数据。

通俗的讲,数据的逻辑结构主要分为两种:

  • 线性的:就是连成一条线的结构,本文要讲的数组和链表就属于这一类,另外还有 队列、栈 等
  • 非线性的:顾名思义,数据之间的关系是非线性的,比如 堆、树、图 等。

栈和队列:都是保存数据的容器,主要用于计算过程中临时保存数据,是最简单的数据结构。

数组和链表:数组,查询速度很快,但插入删除速度很慢;链表,插入删除速度很快,但查询速度慢。所以引入了一种能够在插入,查询,删除等操作都相对的容器,即二叉树。

时间复杂度

O(1) 表示一次操作即可直接取得目标元素(比如字典或哈希表,散列表),O(n) 意味着先要检查 n 个元素来搜索目标(线性时间)。

在最好情况下二分搜索的时间复杂度是 O(1),最坏情况(平均情况)下 O(log n)。比如说有16个元素的数组,我们要找到其中的元素13,二分查找法的时间复杂度就是 O(log 16),即4次;简单查找法的时间复杂度为O(16),即16次。

常见的大O运行时间

 数组链表
读取O(1)O(n)
插入O(n)O(1)
删除O(n)O(1)

(几种排序方式的时间复杂度。。。)待补充

二叉树

(无论是在遍历树、查找深度、查找最大值都用到了递归,递归在非线性的数据结构中是用得非常多的...)

ref: https://juejin.im/post/5ab5a01d518825555c1d9a24

      https://segmentfault.com/a/1190000011947724

二叉树中有一种特殊的二叉树:二叉查找树(binary search tree)。定义:当前根节点的左边全部比根节点小,当前根节点的右边全部比根节点大。这对我们来找一个数是非常方便快捷的。

一般地:都是给出一个数组给你,让你将数组变成一个二叉树,此时就需要我们动态创建二叉树了。

二叉树的遍历

方法:

  • 前序,中序,后序遍历。
  • 层次遍历:分层遍历二叉树(按层次从上到下,从左到右)迭代,相当于广度优先搜索,使用队列实现。队列初始化,将根节点压入队列。当队列不为空,进行如下操作:弹出一个节点,访问,若左子节点或右子节点不为空,将其压入队列。

  • 前序遍历:一种应用是打印一个结构化的文档
  • 中序遍历:一种应用是对树进行排序操作
  • 后序遍历:一种应用是计算一个目录和它的子目录中所有文件所占的空间大小

图片描述       =>                     


数组和链表

  • 数组

数组是一个有限的、类型相同的数据的集合,在内存中是一段连续的内存区域。

  • 链表

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,一般用于插入与删除较为频繁的场景。

数据结构中的堆和栈、队列

一般情况下,有两层含义:
(1)程序内存布局场景下,堆与栈表示两种内存管理方式;
(2)数据结构场景下,堆与栈表示两种常用的数据结构。

内存中堆与栈的一个区别:栈用于存放函数的参数值、局部变量等。栈由操作系统自动分配释放,调用完毕即释放无需我们手动控制;堆的申请和释放工作由程序员控制,容易产生内存泄漏。

栈是一种运算受限的线性表,其限制是指只仅允许在表的一端进行插入和删除操作,这一端被称为栈顶(Top),相对地,把另一端称为栈底(Bottom)。把新元素放到栈顶元素的上面,使之成为新的栈顶元素称作进栈、入栈或压栈(Push);把栈顶元素删除,使其相邻的元素成为新的栈顶元素称作出栈或退栈(Pop)。这种受限的运算使栈拥有“先进后出”的特性(First In Last Out),简称FILO。

栈分顺序栈和链式栈两种。栈是一种线性结构,所以可以使用数组或链表(单向链表、双向链表或循环链表)作为底层数据结构。使用数组实现的栈叫做顺序栈,使用链表实现的栈叫做链式栈,二者的区别是顺序栈中的元素地址连续,链式栈中的元素地址不连续。

堆是一种常用的树形结构,是一种特殊的完全二叉树,当且仅当满足所有节点的值总是不大于或不小于其父节点的值的完全二叉树被称之为堆。堆的这一特性称之为堆序性。因此,在一个堆中,根节点是最大(或最小)节点。如果根节点最小,称之为小顶堆(或小根堆),如果根节点最大,称之为大顶堆(或大根堆)。堆的左右孩子没有大小的顺序。下面是一个小顶堆示例:

 这里写图片描述

堆的存储一般都用数组来存储堆。这里写图片描述

  • 队列

队列(queue)是一种先进先出的、操作受限的线性表。

 其它

迭代与递归是程序设计中最常用的两种结构。任何能使用递归解决的问题都能使用迭代的方法解决。迭代和递归的区别是,迭代使用的是循环结构,递归使用的是选择结构。大量的递归会耗费大量的时间和内存,每次递归调用都会建立函数的一个备份,会占用大量的内存空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值