数据结构

[数据结构与算法] 优先级队列/堆队列 完全二叉堆 左式堆 python里的heapq

≯℡__Kan透↙ 提交于 2020-02-25 15:23:07
学习 清华大学 尊敬的邓俊辉老师的C++数据结构与算法课程 第10章 优先级队列,本文旨在摘要和心得体会。 文章目录 1 优先级队列需求 2 完全二叉堆 2.1 定义 2.2 getMax() 2.3 insert() 插入与上滤 2.4 delMax() 删除与下滤 2.5 heapification 建堆 2.6 就地堆排序 3 左式堆 3.1 堆合并 3.2 左式堆 3.3 左式堆合并算法 3.4 左式堆 插入 3.5 左式堆 删除 4 python里的heapq 1 优先级队列需求 计算机系统里CPU的任务调度, 循 优 先 级 访 问 \color{red}{循优先级访问} 循 优 先 级 访 问 。 不同于队列结构的先进先出,找队列里最大值先出。 约定:优先级队列里的每个数据项目都有一个关键码key,可以进行比较大小(可依靠重载比较操作符实现),关键码越大,优先级越高。 操作接口描述: 操 作 接 口 功 能 描 述 size() 报告优先级队列的规模,即其中词条的总数 insert() 将指定词条插入优先级队列 getMax() 返回优先级最大的词条(若优先级队列非空) delMax() 删除优先级最大的词条(若优先级队列非空) 借助无序列表、有序列表、无序向量或有序向量,都难以同时兼顾insert()和 delMax()操作的高效率

使用canvas制作简易的数据结构核心算法演示系统——线性表(一)

空扰寡人 提交于 2020-02-25 13:35:37
顺序表 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。 顺序表的插入 对于顺序表,在进行插入之前,首先需要找到待插入的位置,以递增有序的顺序表为例 function SqlistInFind ( a , x ) { for ( var i = 0 ; i < a . length ; i ++ ) { if ( x < a [ i ] ) { return i ; } } return i ; } 如上所示,查找插入位置时,按顺序遍历顺序表内所有元素,若找到大于待插入元素的元素,则返回当前位置,否则返回顺序表长度,即插入到最最后。 找到待插入位置之后,即调用进行插入操作的函数 function SqlistInsert ( a , p , x ) { for ( var i = a . length - 1 ; i >= p ; i -- ) { a [ i + 1 ] = a [ i ] ; } a [ p ] = x ; return a ; } 如上所示

Python基本数据类型和数据结构

£可爱£侵袭症+ 提交于 2020-02-25 12:56:38
Python基本数据类型 Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。 Python3 中有六个标准的数据类型: Number(数字) String(字符串) List(列表) Tuple(元组) Set(集合) Dictionary(字典) Python3 的六个标准数据类型中: 不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组); 可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。 Number(数字) Python3 支持 int、float、bool、complex(复数)。 在Python 3里,只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。 像大多数语言一样,数值类型的赋值和计算都是很直观的。 >> > 5 + 4 # 加法 9 >> > 4.3 - 2 # 减法 2.3 >> > 3 * 7 # 乘法 21 >> > 2 / 4 # 除法,得到一个浮点数 0.5 >> > 2 // 4 # 除法,得到一个整数 0 >> > 17 % 3 # 取余 2 >> > 2 ** 5 # 乘方 32 注意: 1

【学习总结】《大话数据结构》- 第1章-数据结构绪论

非 Y 不嫁゛ 提交于 2020-02-25 10:02:01
【学习总结】《大话数据结构》- 总 启示: 数据结构:相互之间存在一种或多种特定关系的数据元素的集合。 目录 1.1 开场白 1.2 你数据结构怎么学的? 1.3 数据结构起源 1.4 基本概念和术语 1.5 逻辑结构和物理结构 1.6 抽象数据类型 1.7 总结回顾 1.8 结尾语 ---------------------------------------------- 1.1 开场白 一些可以略过的场面话... 1.2 你数据结构怎么学的? 举了一个在实时排队系统中使用队列结构而不是数组或者数据库的栗子 说明数据结构的重要性 1.3 数据结构起源 数据结构发展历程 1986年:作为一门独立课程在CS学位课程中出现 70年代初,结构程序设计成为程序设计方法学的主要内容,数据结构在程序设计中占据重要地位 1.4 基本概念和术语 程序设计=数据结构+算法 数据: 描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别、并输入给计算机处理的符号集合。 (包括数值、声音、图像、视频等各种符号) 符合两个条件: 可以输入到计算机中 能被计算机程序处理 数据元素: 组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录。 (人类的数据元素:人) (禽类的数据元素:鸡鸭鹅) 数据项: 一个数据元素可以由若干数据项组成。数据项是数据不可分割的最小单位。 (人元素

C数据结构与算法-基础整理-栈和队列-02:队列的基础操作

若如初见. 提交于 2020-02-24 20:27:18
0x01.关于队列 队列是一种先进先出的数据结构,有入队(EnQueue)和出队(DeQueue)操作。因为数据的存放取出存在优先级的,所有广泛用于各种算法。 队列同样要注意队头指针和队尾指针。 关于循环队列,主要要知道判满与计算长度的数学思想。 0x02.基础数组队列 #define SIZE 50 typedef struct { int data[SIZE]; int head; int tail; }QUEUE; QUEUE Q; void iniqueue() { Q.head = 0; Q.tail = 0; return; } void EnQueue(int m) { if (Q.tail >= SIZE) { printf("队列已满,无法加入元素!!!"); return; } Q.data[Q.tail++] = m; return; } void DeQueue() { if (Q.tail == Q.head) { printf("队列为空,无法取出元素!!!"); return; } int m = Q.data[Q.head++]; printf("队列头元素 %d 已取出!!!\n", m); return; } 0x03.循环队列 由来:普通的队列用着用着,很多的空间就被浪费掉了,循环队列使得队尾可以不断的循环移动,充分利用了空间。 #define

数据结构与算法常见面试题1

烈酒焚心 提交于 2020-02-24 20:22:00
1.八大数据结构及其应用场景(数组、栈、链表、树、图、堆、散列表) 1.数组 数据结构中最基本的一个结构就是线性结构,而线性结构又分为连续存储结构和离散存储结构。连续存储结构其实就是数组。 在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。 使用场景 数组在以下三个情形下很有用: 1)数据量较小。 2)数据规模已知。 3)随机访问,修改元素值。 如果插入速度很重要,选择无序数组。如果查找速度很重要,选择有序数组,并使用二分查找。 缺点 1)需要预先知道数据规模 2)插入效率低,因为需要移动大量元素。 2.栈 是只能在某一端插入和删除的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。 使用场景 1.十进制与其它进制间的转换 125→1111111 2.行编辑器 #退格 @清除 3.平衡符号的判断 {[()()]} 4.中缀表达式转后缀表达式 顺序栈 优点 1)在输入数据量可预知的情形下,可以使用数组实现栈,并且数组实现的栈效率更高

数据结构与算法分析:(三)链表(上)

让人想犯罪 __ 提交于 2020-02-24 13:54:32
一、什么是链表? 链表是一种物理上 非连续 、 非顺序 的存储结构,数据元素之间的顺序是通过每个元素的 指针 (类似C语言中的指针,Java中是引用)关联的。 链表由一系列节点组成,每个节点一般至少会包含两部分信息:一部分是元素数据本身,另一部分是指向下一个元素地址的“指针”。这样的存储结构让链表相比其他线性的数据结构来说,操作会复杂一些。 说到链表,我们经常拿来与数组比。我们先看下面一张图再来对比它们的各自的优劣。 从图中我们看到,数组需要一块 连续 的内存空间来存储,对内存的要求比较高。如果我们申请一个 100MB 大小的数组,当内存中没有连续的、足够大的存储空间时,即便内存的剩余总可用空间大于 100MB,仍然会申请失败。 而链表恰恰相反,它并不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串联起来使用,所以如果我们申请的是 100MB 大小的链表,根本不会有问题。 这里先思考一下下面这个问题。 Q:数组在实现上为什么使用的是连续的内存空间? A:可以借助 CPU 的缓存机制,预读数组中的数据,所以访问效率更高。而链表在内存中并不是连续存储,所以对 CPU 缓存不友好,没办法有效预读。 Q:上一答案中CPU缓存机制指的是什么?为什么就数组更好了? A: CPU在从内存读取数据的时候,会先把读取到的数据加载到CPU的缓存中

数据结构与算法动态可视化!!!

六月ゝ 毕业季﹏ 提交于 2020-02-24 07:35:15
数据结构与算法是计算机专业的必修课,学好数据结构与算法对于每一个程序员都是十分重要的;数据结构对于程序员来说就相当于绝世内功心法对于江湖人士一样重要,学好数据结构甚至决定了以后发展的水平高度。可对于很多人来说,这玩意就是遭罪的,不仅无聊还费脑细胞;对于我这个菜鸟来说,毫无疑问也是个头痛的问题。 个人感觉学好数据结构与算法绝非一朝一夕之功,除了夜以继日的坚持奋斗,好的学习工具也应该充分利用起来,于是今天给大家分享一个学习数据结构与算法的动态可视化网站,个人感觉还是蛮不错的,大家可以借鉴学习。 网址: 数据结构与算法动态可视化网站 进入之后的界面如下图: 可以看到这里包括了数据结构的所有种类以及常见算法。 点击搜索框下拉列表可以选择自己想学习的数据结构和算法的可视化界面,如下图: 在这里给大家一个例子,比如我想看最小生成树,可以搜索“最小生成树关键字”,并选择它,如下图: 单击进入网页,如下图,当然如果你英文看着不习惯,也可以直接右键翻译成中文,如下图: 翻译成中文之后的网页(大概看懂就行,没必要咬文嚼字,那是文学家的事): 可以点击下拉框,则会弹出该数据结构的知识目录,如下图: 点击即可跳转至相应知识点,还可以点击PgDn、PgUp,向上向下翻页,若想自行学习,即可点击Esc,离开并进入探索模式,简单来说,这个模式对于学生来说就是自学模式(对于教师也可以作为辅助教学工具)

python条件语句与基本数据结构(一)

梦想的初衷 提交于 2020-02-24 06:14:51
  7.条件语句       如果1等于1,那么就输出 欢迎进入第一会所, 否则输出 欢迎进入第二会所       代码块       """       if 条件 :         print('OK')       else :         print ('Error')       "''''              1. if基本语句         if 条件:           内部代码块           内部代码块         else :           ...         print('...')           if 1==1 :           print ('欢迎进入第一会所')         else :           print ('欢迎进入第二会所')       2. if支持嵌套       3. if elif                  inp = input ('请输入会员级别:')         if inp == '高级会员'           print ('美女')         elif inp == '白金会员'             print ('一线明星')         else :         print ('城管')           print(

【整理】句柄.内核对象

人走茶凉 提交于 2020-02-24 05:53:08
  句柄是一个标识符,是拿来标识对象或者项目的。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是驻留在内存中的。 C#中的IntPtr类型称为“平台特定的整数类型”,它们用于本机资源,如窗口句柄。 资源的大小取决于使用的硬件和操作系统,但其大小总是足以包含系统的指针(因此也可以包含资源的名称)。 内核对象    内核对象只是内核分配的一个内存块,并且只能由该内核访问。该内存块是一种数据结构,它的成员负责维护该对象的各种信息。 有些数据成员(如安全性描述符、使用计数等)在所有对象类型中是相同的,但大多数数据成员属于特定的对象类型。例如,进程对象有一个进程 I D 、一个基本优先级和一个退出代码,而文件对象则拥有一个字节位移、一个共享模式和一个打开模式。    内核对象的数据结构只能被内核访问,因此应用程序无法在内存中找到这些数据结构并直接改变它们的内容 。 Microsoft 规定了这个限制条件,目的是为了确保内核对象结构保持状态的一致。这个限制也使 Microsoft 能够在不破坏任何应用程序的情况下在这些结构中添加、 删除和修改数据成员。 内核对象包括 如下