数据结构

数据结构——红黑树

别来无恙 提交于 2020-02-06 18:37:38
文章目录 1 引言 2 定义 定义节点名称: 3 性质 4 2-3-4树和红黑树的等价关系 5 查找 6 插入 6.1(情景3) 插入节点的父节点为黑色 6.2(情景4) 插入节点的父节点为红色,叔叔节点为黑色 6.2.1(情景4.2.1) 父节点P为G左孩子,插入位置为左孩子 6.2.2(情景4.2.2) 父节点P为G左孩子,插入位置为右孩子 6.2.3(情景4.3.1) 父节点P为G右孩子,插入位置为右孩子 6.2.4(情景4.3.2) 父节点P为G右孩子,插入位置为左孩子 6.3(情景4.1) 插入节点的父节点为红色,叔叔节点为红色 6.3.1(情景4.1) 插入位置为左子树 6.3.2(情景4.1) 插入位置为右子树 7 删除 删除情景1:替换结点是红色结点 7.1 删除红色叶子节点 7.2 删除红色节点,只有左子树或只有右子树 7.3 删除红色节点,既有左子树又有右子树 7.4 删除的黑色节点仅有左子树或者仅有右子树 7.5 删除黑色的叶子节点 8 总结 9 思考题和习题答案 思考题1:黑结点可以同时包含一个红子结点和一个黑子结点吗? 习题1:请画出图15的插入自平衡处理过程。 习题2:请画出图29的删除自平衡处理过程。 推荐阅读 1 引言 红黑树 是 树 的 数据结构 中最为重要的一种。 Java 的容器 TreeSet 、 TreeMap 均使用 红黑树 实现。

Python 数据结构之队列的实现

喜欢而已 提交于 2020-02-06 18:23:50
队列 是一个抽象的数据结构,与堆栈有些相似。较对比于栈,队列打开两端。 一端总是用来插入数据(排队),另一个是用来删除数据(离队)。 队列使用先入先出的方法,即,第一存储的数据项先被访问。 队列有两端,入口端和出口端,数据只能从入口进入队列。从出口离开队列。因此也被称为FIFO表示先进先出 后进后出。 队列可以使用数组,链表,指针和结构来实现。 双端队列(deque,全名double-ended queue),是一种具有队列和栈的性质的数据结构。 双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。双端队列可以在队列任意一端入队和出队。 # 队列基于Python语言的实现 ''' 队列的基本方法: enqueue(value) 入队 添加新的元素到队列中 dequeue() 出队 从队列中移除元素 peek() 得到在队列最前面的元素 而不移除它 is_full() 检查队列是否存满 没有长度限制的队列可不实现该方法 if_empty() 检查队列是否为空 len() 返回都队列内元素个数 travel() 遍历队列 ''' class Queue ( object ) : """ 队列类 """ def __init__ ( self ) : """ 初始化 """ self . __queue = [ ] def __len__ ( self ) : """

数据结构--二叉搜索树2

浪尽此生 提交于 2020-02-06 16:45:50
之前我们实现了简单的二叉搜索树,现在介绍一下,STL中的容器,应对需要使用二叉搜索树的情况其实,大多数时候,用STL中的set就够了,不需要自己实现 1 #include <iostream> 2 #include <cstdio> 3 #include <set> 4 5 using namespace std; 6 7 // set的内部结构其实不只是搜索二叉树那么简单 8 // set是一种自平衡二叉查找树,名叫红黑树 9 // 如果要对复杂的数据进行操作,需要重写仿函数,来进行大小的确定 10 11 int main() 12 { 13 set<int> s; 14 15 s.insert(1); 16 s.insert(3); 17 s.insert(6); 18 s.insert(5); 19 20 set<int>::iterator it; 21 22 it=s.find(3); 23 24 if(it==s.end()) 25 { 26 puts("find error\n"); 27 } 28 else 29 { 30 puts("find it\n"); 31 } 32 33 s.erase(3); 34 35 it=s.find(3); 36 37 if(it==s.end()) 38 { 39 puts("find error\n"); 40 } 41

java数据结构----链表

試著忘記壹切 提交于 2020-02-06 15:52:37
一.概述 1.概念 链表: 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针连接次序实现的。每一个链表都包含多个节点,节点又包含两个部分,一个是数据域(储存节点含有的信息),一个是引用域(储存下一个节点或者上一个节点的地址)。 2.使用链表的优缺点 使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。 3.链表分类 链表分为 单向链表和双向链表 二. 单向链表 1.单向链表概述 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点由元素和指针构成。在Java中,我们 可以将单链表定义成一个类,单链表的基本操作即是类的方法,而结点就是一个个实例化的对象,每个对象中都有“元素值”和“下一结点地址”两个属性。在“下一结点地址”属性中存储的是下一个对象的引用,这样,一个个对象连在一起就成为了单链表。 2.单链表的逻辑结构 单链表是链表中结构最简单的。一个单链表的节点(Node)分为两个部分,第一个部分(data)保存或者显示关于节点的信息,另一个部分存储下一个节点的地址。最后一个节点存储地址的部分指向空值。 3.单链表的实现(水浒英雄排名案例)

[数据结构与算法]第4章 链表

谁说我不能喝 提交于 2020-02-06 12:40:34
个人博客文章地址 文章目录 4.1 单向环形链表应用场景 4.1.1 Josephu(约瑟夫、约瑟夫环) 问题 4.1 单向环形链表应用场景 4.1.1 Josephu(约瑟夫、约瑟夫环) 问题 Josephu 问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。 提示:用一个不带头结点的循环链表来处理Josephu 问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。 约瑟夫问题-创建环形链表的思路图解 约瑟夫问题-小孩出圈的思路分析图 代码实现: public class Josepfu { public static void main ( String [ ] args ) { // 测试一把看看构建环形链表,和遍历是否ok CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList ( ) ; circleSingleLinkedList . addBoy ( 125 ) ; //

JavaScript--数据结构与算法(二)

本小妞迷上赌 提交于 2020-02-06 07:56:06
排序 知识点:找规律,实现排序题目和变种排序的题目 参考文档: 十大经典排序算法动画与解析 十分钟搞定时间复杂度 排序需要清楚时间复杂度和空间复杂度 时间复杂度是计算运行的次数,空间复杂度是计算占用的内存 题目: 冒泡排序 代码实现: export default (arr) => { // 冒泡排序 let len = arr.length // 通过i来控制边界 for (let i = len - 1, swap; i > 0; i--) { for (let j = 0; j < i; j++) { swap = arr[j] if (swap > arr[j + 1]) { arr[j] = arr[j + 1] arr[j + 1] = swap } } } return arr } 选择排序 代码实现: export default (arr) => { let len = arr.length for (let i = 0; i < len - 1; i++) { let min = arr[i] // 每轮需要比较的次数N-1 for (let j = i + 1; j < len; j++) { if (arr[j] < min) { let c = min min = arr[j] arr[j] = c } } arr[i] = min } return

数据结构之算法时间复杂度

半城伤御伤魂 提交于 2020-02-06 05:30:39
原文链接 算法的时间复杂度定义为: 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n}=0(f(n))。它表示随问题规模n的增大,算法执行时间的埔长率和 f(n)的埔长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f( n)是问题规横n的某个函数。 根据定义,求解算法的时间复杂度的具体步骤是: 找出算法中的基本语句   算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。 计算基本语句的执行次数的数量级   只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。 用大Ο记号表示算法的时间性能   将基本语句执行次数的数量级放入大Ο记号中。 如何推导大o阶呢?我们给出了下面 的推导方法: 1.用常数1取代运行时间中的所有加法常数。 2.在修改后的运行次数函数中,只保留最髙阶项。 3.如果最高阶项存在且不是1,则去除与这个项相乘的常数。 简单的说,就是保留求出次数的最高次幂,并且把系数去掉。 如T(n)=2n^2+n+1 =O(n^2) 例如: #include "stdio.h" int main

数据结构与算法之二叉搜索树

纵饮孤独 提交于 2020-02-06 05:09:33
二叉搜索树 二叉搜索树又称为二叉排序树,首先二叉搜索树是一棵二叉树,所谓二叉树,就是"任意节点最多允许两个子节点",这两个子节点称为左右子节点。 性质: 若左子树非空,则左子树上的所有节点均小于其根节点 若右子树非空,则右子树上的所有节点均大于其根节点 即任意节点的值一定大于其左子树中的每一个节点的值,并小于右子树中的每一个节点的值。换句话说, 中序遍历二叉搜索树得到的序列为从小到大排序的有序序列。 二叉搜索树基本实现: //二叉搜索树的实现 #include<iostream> using namespace std; struct Node{ int data;//数据 struct Node *lchild;//左孩子结点 struct Node *rchild;//右孩子结点 Node(int x):data(x),lchild(nullptr),rchild(nullptr){}; }; //从二叉树中搜索对应的val值,如果存在在返回该结点,若不存在则返回空指针 Node* SearchBST(Node* root,int val) { while(root!=nullptr) { if(root->data == val) return root; root = root->data > val?root->lchild:root->rchild; } return

【Python数据结构与算法复习day40】1-04常见时间复杂度与大小关系常见时间复杂度之间的关系+常见时间复杂度之间的关系(必背)+n的阶层的时间复杂度比n的n次方的时间复杂度低

眉间皱痕 提交于 2020-02-06 04:16:24
1-04常见时间复杂度与大小关系 文章目录 1-04常见时间复杂度与大小关系 常见的时间复杂度 常见时间复杂度之间的关系 练习: 时间复杂度练习( 参考算法的效率规则判断 ) 解答 常见的时间复杂度 注意,经常将log2n(以 2 为底的对数)简写成logn 常见时间复杂度之间的关系 所消耗的时间从小到大:【必背!!!!!!】 练习: 时间复杂度练习( 参考算法的效率规则判断 ) O(5) O(2n + 1) O(n²+ n + 1) O(3n³+1) 解答 O(5)=O(1) O(2n + 1)=O(n) O(n²+ n + 1)=O(n²) O(3n³+1)=O(n³) 所以 O(5)<O(2n + 1)<O(n²+ n + 1)<O(3n³+1) 来源: CSDN 作者: 汪雯琦 链接: https://blog.csdn.net/qq_35456045/article/details/104185928

数据结构中的数组——静态数组类的创建

扶醉桌前 提交于 2020-02-06 04:05:23
1,顺序存储线性表两个问题: 1,当做数组误用; 2,效率有隐患; 2,本文解决第一个功能上的问题,创建一个数组类代替顺序存储结构中的数组访问操作符; 3,本文目标: 1,完成 Array 类的具体实现; 2,完成 StaticArray 类的具体实现,替代原生数组; 4,需求分析: 1,创建数组类代替原生数组的使用; 1,数组类包含长度信息; 2,数组类能够主动发现越界访问; 5,Array 设计要点: 1,抽象类模板,存储空间的位置和大小由子类完成; 2,重载数组操作符,判断访问下标是否合法(满足上面第二点,且满足原生数组访问操作); 3,提供数组长度的抽象访问函数(满足上面第一点); 4,提供数组对象间的复制操作(附加的功能); 6,Array 类的声明; 7,Array 数组抽象类实现: 1 #ifndef ARRAY_H 2 #define ARRAY_H 3 4 #include "Object.h" 5 #include "Exception.h" 6 7 namespace DTLib 8 { 9 10 template <typename T> 11 class Array : public Object 12 { 13 protected: 14    T* m_array; 15 16 public: 17 virtual bool set(int i,