算法与数据结构

C#与数据结构--树论--平衡二叉树(AVL Tree)

百般思念 提交于 2019-12-25 05:41:40
1. 为什么平衡树? 在二叉搜索树(BST,Binary Search Tree)中提到,BST树可能会退化成一个链表( 整棵树中只有左子树,或者只有右子树 ),这将大大影响二叉树的性能。 前苏联科学家G.M. Adelson-Velskii 和 E.M. Landis给出了答案。他们在1962年发表的一篇名为《An algorithm for the organization of information》的文章中提出了一种自平衡二叉查找树( self-balancing binary search tree )。这种二叉查找树在插入和删除操作中,可以通过一系列的旋转操作来保持平衡,从而保证了二叉查找树的查找效率。最终这种二叉查找树以他们的名字命名为“AVL-Tree”,它也被称为平衡二叉树(Balanced Binary Tree)。 2. 原理 在节点上设置一个平衡因子BF,代表左右子树的高度差,BF = { -1, 0, 1}。 3. 旋转 AVL的Insert/Delete操作可能会引起树的失衡,可以通过选择解决这个问题。 3.1 4种旋转 (1)LL (2)RR (3)LR (4)RL 在下面的文章中有一个关于AVL选择的动画,大家不妨看看。 C#与数据结构--树论--平衡二叉树(AVL Tree) 3.2 旋转实现 在算法导论中给出旋转的伪代码: LEFT

java实现数据结构13(红黑树详解代码之自定义红黑树)

落花浮王杯 提交于 2019-12-25 05:17:36
自定义红黑树 import com . sun . org . apache . regexp . internal . RE ; /** * @description: 自定义红黑树 * @author: liangrui * @create: 2019-12-24 13:50 **/ public class RedBlackTree < K extends Comparable < K > , V > { private static final boolean RED = true ; private static final boolean BLACK = false ; private class Node { public K key ; public V value ; public Node left , right ; public boolean color ; public Node ( K key , V value ) { this . key = key ; this . value = value ; left = null ; right = null ; color = RED ; } } private Node root ; private int size ; public RedBlackTree ( ) { root = null ;

牢记数据结构的时间复杂度 #P004#

人走茶凉 提交于 2019-12-24 21:37:09
虽然大多数情况下,Python程序都不会应用在计算密集型的场景。但是,作为一个合格的工程师,依然应该对Python内置数据类型的时间复杂度有一个基本的了解,才能够避免写出一些明显低效的代码。打个比方,我们都知道,在Python里面list是异构元素的集合,并且能够动态增长或收缩,可以通过索引和切片访问。那么,又有多少人知道,list是一个数组而不是一个链表呢。 1 时间复杂度的重要性 算法的时间复杂度是用来度量算法的运行时间,算法的空间复杂度用来度量程序占用的内存,这两个都是计算机系统中非常重要的概念。它们直接关乎程序的运行效率,其重要程度怎么强调都不为过。在这一小节中,我们将通过一个Python字符串连接的例子,来解释说明程序的时间复杂度和空间复杂度的重要性。 合格的Python工程师应该知道,Python中的字符串是不可变的。因为Python中的字符串是不可变的,在进行字符串操作时,Python每次操作都会产生一个新的字符串,新的字符串会占用一块独立的内存。因此,在操作字符串时,应该避免产生太多的中间结果。例如,下面就是一个典型的反面教材: In [1]: fruits = ['orange', 'apple', 'banana', 'pear'] In [2]: statement = fruits[0] In [3]: for item in fruits[1:]: ...

Jack Su Sparrow C# 数据结构 基础 论述

故事扮演 提交于 2019-12-24 20:10:11
本文转载连接: https://www.cnblogs.com/slf007/p/4546758.html 问题: 信息世界中,计算机是加工处理的信息的载体,在这个过程中面临着三个问题: 1.如何方便高效的组织数据 2.如何在计算机中存储数据(内存和外存) 3.如何对存储的数据进行高效的操作 目的: 我们都知道,我们都会表述一件事,老板交代你一件事情,你要陈述给你的员工,让他们明白你的意思,有些人可能简要的几句话 就把事情表达清楚,可是有的人说了一大堆才明白他说什么,这个比喻不太恰当,同样在面对同一个程序的时候我们就可以出现两 种程序:有的人写出来的程序效率很高,有的人却用复杂的方法来解决一个简单的问题。 简而言之目的有三个: 1.形成自己数据结构知识库 2.提高程序设计水平 3.提供程序设计者的基本技能 基本概念和术语 1.数据(Data):能被计算机识别的信息的载体,数值数据,声音,文字等等 2.数据元素(Data Element)和数据项(Data Item)DE:数据的实体 DI:数据的属性 最常见的是数据表的一条记录(用户) 和 字段(用户名,密码,性别等等) 3.数据对象(Data Object)性质相同的数据元素的集合 例如:{0,1,2,3,4} , {a,b,c,d} , {用户A,用户B,用户C….} 4.数据类型(Data Type)int,string等等

java数据结构

无人久伴 提交于 2019-12-24 04:46:43
第一章 数据结构 2.1 数据结构有什么用? 当你用着java里面的容器类很爽的时候,你有没有想过,怎么ArrayList就像一个无限扩充的数组,也好像链表之类的。好用吗?好用,这就是数据结构的用处,只不过你在不知不觉中使用了。 现实世界的存储,我们使用的工具和建模。每种数据结构有自己的优点和缺点,想想如果Google的数据用的是数组的存储,我们还能方便地查询到所需要的数据吗?而算法,在这么多的数据中如何做到最快的插入,查找,删除,也是在追求更快。 我们java是面向对象的语言,就好似自动档轿车,C语言好似手动档吉普。数据结构呢?是变速箱的工作原理。你完全可以不知道变速箱怎样工作,就把自动档的车子从 A点 开到 B点,而且未必就比懂得的人慢。写程序这件事,和开车一样,经验可以起到很大作用,但如果你不知道底层是怎么工作的,就永远只能开车,既不会修车,也不能造车。当然了,数据结构内容比较多,细细的学起来也是相对费功夫的,不可能达到一蹴而就。我们将常见的数据结构:堆栈、队列、数组、链表和红黑树 这几种给大家介绍一下,作为数据结构的入门,了解一下它们的特点即可。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SDTDwAvC-1577090514597)(img\数据结构比喻.png)] 2.2 常见的数据结构 数据存储的常用结构有:栈、队列、数组

《数据结构与算法》-2-线性表

我的梦境 提交于 2019-12-23 13:24:02
目录 1. 线性表的定义和基本操作 1.1 线性表的定义 1.2 线性表的基本操作 2. 线性表的顺序表示 2.1 顺序表的定义 2.2顺序表上基本操作的实现 3. 线性表的链式表示 3.1 单链表的定义 3.2 单链表基本操作的实现 3.3 双链表 3.4 循环链表 3.5 静态链表 4. 顺序表与链表的比较 5. 如何选择存储结构   该系列博客的目的是为了学习一遍数据结构中常用的概念以及常用的算法,为笔试准备;主要学习过程参考王道的《2018年-数据结构-考研复习指导》; 已总结章节: 《数据结构与算法》-1-绪论 《数据结构与算法》-2-线性表   上篇博客 《数据结构与算法》-1-绪论 中说到数据结构的三要素:逻辑结构、存储结构、数据的运算;其中,逻辑结构表示的是数据元素之间的关系,逻辑结构根据数据元素之间关系的不同,分成了线性结构与非线性结构,这里我们将要介绍的就是线性结构中的线性表,并根据线性表在计算机中存储结构的不同,分别介绍了:顺序存储(顺序表)、链式存储(链表);   这篇主要介绍的内容有: 线性表的定义以及基本操作 ; 线性表的顺序存储 ; 线性表的链式存储 ; 顺序表与链表的比较 ;   其知识框架如下图所示: 1. 线性表的定义和基本操作   这一节主要介绍线性表,主要内容包括:线性表的定义及基本操作; 1.1 线性表的定义   定义: 线性表是具有 相同

数据结构与算法基础--第14周01--第8章排序1--8.1排序概述

百般思念 提交于 2019-12-23 01:09:06
>排序:什么是排序? 将一组杂乱无章的数据按照一定规律顺次排列起来,即: 将无序序列排成一个有序序列(由小到大/由大到小)的运算。 >>排序方法的分类: 1、按数据 存储介质 :内部排序和外部排序 2、按 比较器个数 :串行排序和并行排序 3、按 主要操作 :比较排序和基数排序 4、按 辅助空间 :原地排序和非原地排序 5、按 稳定性 :稳定排序和非稳定排序 6、按 自然性 :自然排序和非自然排序 >>按照排序依据的原则: 插入排序 :直接插入排序、折半插入排序、希尔排序 交换排序 :冒泡排序、快速排序 选择排序 :简单选择排序、堆排序 归并排序 :2-路归并排序 基数排序 >>按照排序所需工作量: 简单排序方法 :T(n)=O(n²) 基数排序 :T(n)=O(d.n) 先进的排序方法 :T(n)=O(nlogn) 来源: CSDN 作者: sinat_38792591 链接: https://blog.csdn.net/sinat_38792591/article/details/103654625

队列--数据结构与算法JavaScript描述(5)

我怕爱的太早我们不能终老 提交于 2019-12-22 09:39:04
队列 Queue 概念 队列是一种列表,但队列只能在队尾插入元,在队首删除元素。 队列是一种先进先出的数据结构,用于存储按顺序排列的数据,被用在很多地方,比如提交操作系统执行的一系列进程、打印任务池等,一些仿真系统用队列来模拟银行或杂货店里排队的顾客。 可以将队列想像成在银行前排队的人群,排在最前面的人第一个办理业务,新来的人只能在后面排队,直到轮到他们为止。 对队列的操作 向队列中插入新元素(入队):push( ) 删除队列中的元素(出队):pop( ) 读取队头的元素: peek( ) 用数组实现队列 function Queue() { this.dataStore = []; this.enqueue = function(element){ this.dataStore.push(element); } this.dequeue = function(){ return this.dataStore.shift(); } this.front = function(){ return this.dataStore[0]; } this.back = function(){ return this.dataStore[this.dataStore.length - 1]; } this.empty = function(){ return this.dataStore

20182311 2019-2020-1 《数据结构与面向对象程序设计》实验九报告

旧街凉风 提交于 2019-12-22 07:59:16
20182311 2019-2020-1 《数据结构与面向对象程序设计》实验九报告 课程:《程序设计与数据结构》 班级: 1823 姓名: 冷冲 学号:20182311 实验教师:王志强 实验日期:2019年12月7日 必修/选修: 必修 1.实验内容 初始化:根据屏幕提示(例如:输入1为无向图,输入2为有向图)初始化无向图和有向图(可用邻接矩阵,也可用邻接表),图需要自己定义(顶点个数、边个数,建议先在草稿纸上画出图,然后再输入顶点和边数) 图的遍历:完成有向图和无向图的遍历(深度和广度优先遍历) 完成有向图的拓扑排序,并输出拓扑排序序列或者输出该图存在环 完成无向图的最小生成树(Prim算法或Kruscal算法均可),并输出 完成有向图的单源最短路径求解(迪杰斯特拉算法) 2. 实验过程及结果 (一)初始化:基于邻接矩阵构建有向图和无向图 import java.util.*; public class Graph { private int[][] matrix;//邻接矩阵 private char[] vexs;//顶点数组 private int vexnum;//节点数 private int arcnum;//边数 private int[] isVisited;//0表示未被访问。1表示访问过 private Queue list; public Graph

非算法工程师面试必问的算法面试理论

帅比萌擦擦* 提交于 2019-12-22 02:58:12
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 非算法方向的你 面了多少次试? 最后,因为不懂算法, 死在了半路上? 这些痛, 作为技术创新型公司的小编——个推君 怎么会不懂? 为此,个推君特请了我司经验丰富的面试官 为你奉上一份热乎的 面试宝典 。 宝典可不是面试题哦 仅送给想认真钻研的童鞋 帮大家梳理知识点 让大家举一反三, offer拿到手软! 注:此处建议大家使用 C 语言来学习数据结构与算法。 一、数据结构 数据结构是算法的基础。大家需要对数据结构有个清晰的概念,因为大部分的算法题均需要带入数据结构的概念来处理。科班出身的程序员或多或少学习过数据结构。我们推荐大家可以重温下这本书,温故而知新。 时间复杂度与空间复杂度 在说算法之前和大家科普两个重要的理论知识:算法的时间复杂度与空间复杂度。 时间复杂度 算法的时间复杂度,用来度量算法的运行时间,记作: T(n) = O(f(n))。它表示随着 输入大小n 的增大,算法执行需要的时间的增长速度可以用 f(n) 来描述,并且会忽略常量部分。 举个例子 int aFunc(void) { printf("Hello, World!\n"); // 需要执行 1 次 return 0; // 需要执行 1 次} 调用此方法,printf("Hello, World!\n"); 执行了一次,那么我们记作 T