数据结构

Data Structures[翻译]

a 夏天 提交于 2020-03-05 14:24:52
Data Structures 【原文见: http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=dataStructures 】 作者 By timmac TopCoder Member 翻译 农夫三拳@seu drizzlecrj@gmail.com 即使计算机能够毫不夸张的每秒执行上百万次的数学运算,当一个问题变得庞大且复杂时,性能仍然是一个很重要的考虑方面。最至关紧要的关于快速解决问题的方面之一就是数据在内存中是如何存储的。 为了举例说明这点,可以试想你进入一个图书馆去查找某个学科的一本书。最有可能的是你能够使用一些电子参考或者在最坏情况下,有一个卡片目录来帮助你找到你想要的书的名称和作者。由于书籍都是按目录进行排放的并且在每一个目录中是按照作者的姓名排序的,因此这是一个直接并且轻松的过程,那么然后你就可以在书架上找到你想要的书了。 现在,假定你去图书馆找一本特定的书,然而这里没有排放好的书架,只有在房间角落有一些排成行的袋子,里面放满了可能相关可能不相关的书。这样就可能需要数个小时甚至数天来找到你需要的书了,这是一个对比性强的道理。这就是数据在没有存储为与应用相关的格式时软件运行的情况。 简单的数据结构(Simple Data Structures) 最简单的数据结构是原生的变量。他们存放单个值,并且使用中受限

数据结构笔记:栈

烂漫一生 提交于 2020-03-05 09:38:06
原文地址 [ 分类目录——数据结构笔记](https://blog.csdn.net/bbjg_001/category_9753496.html) 栈(stack),有些地方也成为堆栈,是一种容器,可存储元素、访问元素、删除元素,他的特点是值能允许在容器的一段(称之为 栈顶 top)进行数据的追加(push)和数据读出(pop)。没有了位置/索引的概念,保证任何时候可以访问、删除的元素都是在此前左后存入的那个元素,确定了一种默认的访问顺序。 由于栈数据结构只允许在一段进行操作,因而按照后进先出(LIFO,Last In First Out)的原理运作。 可以通过线性表(顺序表或链表)实现,通过限制操作方法,只能从一端操作(存取) 通过顺序表的方式实现 栈 的数据结构 class Stack ( object ) : def __init__ ( self ) : self . __list = [ ] # 通过list来实现 def push ( self , value ) : '''压/入栈:从栈顶添加元素''' self . __list . append ( value ) # 把list的尾部当做栈顶来用 def pop ( self ) : '''出栈,从栈顶取元素''' self . __list . pop ( ) # 把list的尾部当做栈顶 def peek

数据结构与算法单排日记-2020/2/29-队列

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-05 06:25:27
1.队列是一个有序列表,可以用数组或者链表表示。 2.遵循先入先出的原则:先存入队列的数据,要先取出。后存入的要后取出。 数组模拟队列 队列本身是一个有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下。其中 maxSize是该队列的最大容量 。 因为队列的输出、输入分别从前后端来处理,因此需要两个 变量front及rear分别记录前后端 的下标。 初始化 rear初始值默认为-1; rear指向队列尾的位置(就是队列尾) front初始值默认为-1; front指向队列首的前一个位置(不是队列首) 将数据存入队列(addQueue): 将尾部指针往后移,rear+1,如果front=rear,则队列为空 若rear小于最大下标maxSize-1,那么将数据存入rear所指的数组元素中。否则无法存入。 rear==maxSize-1,则队列已满。 当数据出队列时: 首指针往后移:front+1 代码实现: public class DemoQueue { /* 当将数据存入队列时: 1.将尾指针往后移:rear+1,当front==rear,队列为空 2.若尾指针rear==maxSize-1时,队列满,无法存入数据 当数据出队列时: 首指针往后移:front+1 */ private int maxSize ; //数组最大容量 private int rear ;

数据结构--堆

泄露秘密 提交于 2020-03-05 02:48:25
堆,与其说是一种数据结构,不如说是一种排序算法。用堆算法,可以轻松得到一组数据中最大的或最小的元素。 其结构就是完全二叉树的顺序存储方式。即在一个数组中存储一颗完全二叉树。 通常,堆分为"大根堆"和"小根堆",前者的树顶元素是数组中最大的一个,后者是最小的一个。 常用操作: 入堆:元素被加入到堆中,以小根堆为例,新元素首先被放到队列最尾端,然后何其父节点比较,如果小于其父节点,则交换两者。以此类推,一直追溯到树顶元素,或者在半途,它不再小于它的父节点。操作完成。 出堆:出堆操作,就是得到当前队列中最大或最小的元素。对于一个合法的堆结构,其首元素就是所要找的。关键是这个元素取出后,其他元素要填补其移走的空白。和入堆操作相反,出堆操作是从树顶至叶节点的操作。 将一个队列构建成堆:这个操作相对复杂一些,每次都从堆底向堆顶找到其最大或最小的元素,然后分别对起两个子节点作此操作。 1 #include " Array.h " 2 #include < utility > 3 #include < algorithm > 4 template < typename T > 5 class heap 6 { 7 public : 8 heap(){} 9 10 void push_heap( const T & data) 11 // 入堆 12 { 13 if (m_array.empty()

算法与数据结构——排序(六)堆排序

馋奶兔 提交于 2020-03-05 02:46:33
在前面的排序算法里面,我们发现每次找到一个最小的数都要进行很多次的比较,比如在n个数里面,我们如果想要找到最小的数,那么就需要比较 n-1次,那么我们想,能不能减少每次比较的次数呢。 其实发现是可以的,在前面的简单选择排序算法里面,我们每次找到最小的数后,剩余的一些数,其实有的是已经经过比较了的,所以在我们寻找第二小的数的时候,完全可以利用第一次的比较结果,但是由于我们没有把第一次比较的结果记录下来,所以我们在后面的比较过程中用不到,那么我们会想,能不能想办法把第一次比较的结果保存下来呢。办法肯定是有的,这就是今天我们要学习的堆排序。 那么什么是堆排序呢,我们首先要弄清楚什么是堆。看下面的两个图,它们都是堆: 通过图我们可以看出,它们的根结点,要么比他们的左右孩子都大,要么比他们的左右孩子都小。这就是堆。具体的定义就是: 堆是具有以下性质的完全二叉树,每个结点的值都大于或者等于其左右孩子结点的值,叫做大顶堆,每个结点的值都小于或者等于其左右孩子结点的值,叫做小顶堆。由二叉树的一个性质,我们可以知道,一个完全二叉树,如果它的根结点位置是i,那么它左孩子位置就是2i,右孩子位置就是2i+1,所以大顶堆可以定义为ki>=k2i并且ki>=k2i+1,小顶堆的符号刚刚相反。 把堆进行层序遍历装入数据组,是如下结果: 堆排序算法,就是把一个序列构造成一个大顶堆(此处以大顶堆为例)

数据结构——堆排序

北战南征 提交于 2020-03-05 02:43:18
堆排序总结 堆排序思想:最大堆的堆顶元素是全部数据中的最大值,输出这个值 。再将剩余元素整理成新的最大堆,此时堆顶元素有时又是剩余元素 的最大值,再输出这个值。继续这个过程,每次输出堆顶元素,并将 剩余元素整理成新的最大堆再输出... 堆排序要解决的几个问题 1:如何将数据排列成堆的形式——初始堆的建立 2:输出堆顶元素后,剩余元素如何再整理成新的堆——堆的整理 3:输出元素放在什么位置 预备知识: 1: 堆中的元素存储在一个数组中,根据堆中的各元素之间具有 有序性关系,可以使用二叉树的方式来表示一个堆。因为各元素从前 至后存放在数组的钱n 个单元中,所以所画的二叉树实际上是一颗完全 二叉树 2: 所以根据完全二叉树的性质,数组前一半的数据都是分值节点,后一半 的数据都是叶子节点 3: 即如果有七个数,分别占据数组的a[1]-a[7],那么7/2=3,所以a[1], a[2],a[3]为分支节点,剩下的为叶子节点 4: a[i]的左儿子为a[i*2],右儿子为a[i*2+1],如a[1]的左右儿子分别为 a[2]与a[3]。(这有赖于数组从a[0]开始,还是从a[1]开始) 建堆的过程: 见代码,见实例图 /*********************************************************/ /*数组从下标1开始*/ #include

编程珠玑第一部分基础

≯℡__Kan透↙ 提交于 2020-03-05 00:11:13
算法基础 问题定义:正确明确问题是什么 时间—空间折中与双赢:尽可能的减少时间和空间 简单的设计:尽可能的简单但不要过于简单 算法设计 排序:排序最显而易见的用处是产生有序的输出,该输出既可以是系统规范要求的一部分,也可以是另一个程序(例如二分搜索程序)的前期准备工作。 标识:当使用等价关系来定义类时,定义一种标识使得类中的每一项都具有相同的标识。而该类以外的其他项则没有该标识。 数据结构选择 将大程序缩减为小程序。正确的数据结构设计可以节省时间和空间、提高可移植性和可维护性。 注:程序员在节省空间方面无计可施时,将自己从代码中解脱出来,退回七点并集中心力研究数据,常常能有奇效。(数据的)表示形式是程序设计的根本 下面是退回起点进行思考时的几条原则。 使用数组重新编写重复代码。冗长的相似代码常常可以使用最简单的数据结构——数组来更好地表述。 封装复杂结构。当需要非常复杂的数据结构时,使用抽象术语进行定义,并将操作表示为类。 尽可能使用高级工具。超文本、名字—值对、电子表格、数据库、变成语言等都是特定问题领域中的强大的工具 从数据得出程序的结构。通过恰当的数据结构来替代复杂的代码,从数据可以可以得到程序的结构。万变不离其宗:在动手编写代码之前,优秀的程序员会彻底理解输入、输出和中间数据结构,并围绕这些结构创建程序。 编写正确的程序 问题很重要,需要认真地编写代码

Scala快速入门-基本数据结构

我只是一个虾纸丫 提交于 2020-03-04 22:20:41
模式匹配 使用用模式匹配实现斐波那契 def fibonacci(in: Any): Int = in match { case 0 => 0 case 1 => 1 case n: Int if(n > 1)=> fibonacci(n - 1) + fibonacci(n - 2) case _ => 0 } println(fibonacci(3)) 元组tuple 元组可以保存不同类型的值,不能通过名称获取字段,而是使用位置下标来读取对象;而且这个下标基于1,而不是基于0。 val hostPort = ("localhost", 80) println("host:%s,port:%s".format(hostPort._1,hostPort._2)) 执行结果: host:localhost,port:80 选项 Option Option 是一个表示有可能包含值的容器。 Option基本的接口是这样的: trait Option[T] { def isDefined: Boolean def get: T def getOrElse(t: T): T } 映射 Map Option本身是泛型的,并且有两个子类: Some[T] 或 None Map.get 使用 Option 作为其返回值,表示这个方法也许不会返回你请求的值。 val map = Map(1 ->

数据结构与算法(一):浅谈数据结构

喜欢而已 提交于 2020-03-04 17:27:54
什么是数据结构 简单来说, 数据结构+算法=程序。 传统上,我们把数据结构分为 逻辑结构 和 物理结构 。 逻辑结构 :是指数据对象中数据元素之间的互相关系,也是我们今后最需要关注和讨论的问题。 物理结构 :是指数据的逻辑结构在计算机中的存储形式。 逻辑结构: 集合结构:内部除了同属一个集合外,没有其他关系。 线性结构:线性结构中的数据元素之间是一对一的关系。 树形结构:树形结构中的数据元素之间存在一种一对多的层次关系。 图形结构:图形结构的数据元素是多对多的关系。 物理结构: 数据元素的存储结构形式有两种:顺式存储结构和链式存储结构。 顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。 例如我们编程语言的数组结构就是典型的顺序存储结构。 链式存储结构:从顺序存储结构我们想到了日常生活中的排队,但现实生活中,我们发现不是完全如此。 例如排队时,有人被迫离开队伍去上洗手间,还有人不遵守基本道德规范插队,这些情况会破坏 存储结构的基本原则 。面对这样时常要变化的结构,顺序存储结构是不安全的,所以引出 链式存储结构 。 例如现在的银行、医院叫号系统,排队时无论你在哪里,只需要关注你的“号”有没有被叫到。 链式存储结构就是这样的原理,把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。 很显然

数据结构实验之二叉树一:树的同构

余生颓废 提交于 2020-03-04 14:21:42
数据结构实验之二叉树一:树的同构 Description 给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。 图1 图2 现给定两棵树,请你判断它们是否是同构的。 Input 输入数据包含多组,每组数据给出2棵二叉树的信息。对于每棵树,首先在一行中给出一个非负整数N (≤10),即该树的结点数(此时假设结点从0到N−1编号);随后N行,第i行对应编号第i个结点,给出该结点中存储的1个英文大写字母、其左孩子结点的编号、右孩子结点的编号。如果孩子结点为空,则在相应位置上给出”-”。给出的数据间用一个空格分隔。 注意:题目保证每个结点中存储的字母是不同的。 Output 如果两棵树是同构的,输出“Yes”,否则输出“No”。 Sample Input 8 A 1 2 B 3 4 C 5 - D - - E 6 - G 7 - F - - H - - 8 G - 4 B 7 6 F - - A 5 1 H - - C 0 - D - - E 2 - Output Yes Hint 测试数据对应图1 代码: #include<bits/stdc++.h> using namespace std; typedef struct