算法与数据结构

数据结构——哈夫曼树

痴心易碎 提交于 2019-12-19 12:40:57
转自:http://www.cnblogs.com/skywang12345/p/3706833.html 哈夫曼树的介绍 Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树。 定义 :给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树。 这个定义里面涉及到了几个陌生的概念,下面就是一颗哈夫曼树,我们来看图解答。 (01) 路径和路径长度 定义 :在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。 例子 :100和80的路径长度是1,50和30的路径长度是2,20和10的路径长度是3。 (02) 结点的权及带权路径长度 定义 :若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。 例子 :节点20的路径长度是3,它的带权路径长度= 路径长度 * 权 = 3 * 20 = 60。 (03) 树的带权路径长度 定义 :树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL。 例子 :示例中,树的WPL= 1* 100 + 2* 50 + 3* 20 + 3* 10 = 100 + 100 + 60 + 30 =

2019_12_18 Summary(revised)

混江龙づ霸主 提交于 2019-12-19 01:31:03
编程模式 计算机语言解决问题的模式 过程式编程模式 面向过程编程模式 函数式编程模式 说明式编程模式 高级编程语言介绍 高级语言(High-level programming language)相对于机器语言(machine language)是一种指令集的体系。在这种语言下,其语法和结构更类似汉字或者普通英文,且由于远离对硬件的直接操作,使得一般人更容易学习。高级语言通常按其基本类型、代系、实现方式、应用范围等分类。 高级语言有一下几种分类: BASIC语言 PASCAL语言 C语言 C++语言 Java语言 Ada语言 Logo语言 脚本语言 并行程序设计 并行程序设计语言 语言名称 注释 Concurrent Pascal Pascal语言的拓展 Ada 全新的编程语言 Modula-P Modula2语言的拓展 C ∗ C^* C ∗ C语言针对SIMD系统的扩展 Concurrent C C语言扩展 Fortran D Fortran语言针对数据并行化语言的拓展 并行程序设计语言的编译过程 计算机中的数据 数据 数据的定义 数据就是用文字, 数字, 图形, 图像, 声音等方式对人, 事件, 事物等进行的描述.在计算机科学中, 数据是指所有能输入计算机并能被计算机程序处理的符号的总称, 数字, 文本, 音频, 图形, 图像和视频等统称为数据. 数据和信息的区别

数据结构与算法之哈希表结构

↘锁芯ラ 提交于 2019-12-19 00:26:21
一、概念 也称散列表,是指根据关键码值(key-value)而直接进行访问的数据结构,也就是说它通过把关键码值映射到表中的一个位置来访问记录,以加快查找的速度,这个映射函数叫做散列函数,存放记录的数组叫做散列表,也称哈希表。 二、一句话概括 哈希表就是由数组和链表二者结合而成的新型数据结构。数组存放key(经过hash计算后生成的存放key的数组位置),链表存放value。 三、图解 hash算法有很多,比如最简单的哈希算法就是用存放的值去取模数组长度。比如存放元素20,那就是20%5=0,所以20这个元素就存放在数组下标为0的位置,再比如4%5=4,所以元素4存放在数组下标为4的位置。 回想下Java的hashmap,典型的key-value,那么我们put的时候是存放到哪了呢?其实就是key的hash算法得到一个数组下标位置,将其存进去。当然比我说的复杂的多,但是大致原理确是如此。 当我们getKey的时候,首先会根据key进行hash算法得到数组下标位置,查找时间复杂度为O(1)。 四、哈希碰撞 多个key经过hash算法后得到的是同一个值(同一个数组下标),这就称之为哈希碰撞。这时候可以将他们的值都存放在链表中。(毕竟链表是拉链式的,可以往后next next next) 五、Google上机题 Google机试题。 就是让你存储员工信息,员工包含id和name

数据结构:(2)时间复杂度和空间复杂度

僤鯓⒐⒋嵵緔 提交于 2019-12-18 22:10:04
一.算法效率的度量方法 1.事后统计方法: 这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。 2.事前分析估算方法:在计算机程序编写前,依据统计方法对算法进行估算。 经过总结,一个高级语言编写的程序在计算机上运行时所消耗的时间取决于下列因素: -1.算法采用的策略,方案 -2.编译产生的代码质量 -3.问题的输入规模 -4.机器执行指令的速度 二.函数的渐变增长 1.判断一个算法效率,函数中的常数和其他次要项常常可以忽略,而更应该关注主项(最高项)的阶数。 三.算法时间复杂度 1.算法时间复杂度的定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)=O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。 2.如何分析一个算法的时间复杂度呢?即如何推导大O阶呢? -1.用常数1取代运行时间中的所有加法常数。 -2.在修改后的运行次数函数中,只保留最高阶项。 -3.如果最高阶项存在且不是1,则去除与这个项相乘的常数。 -4.得到的最后结果就是大O阶。 3.最坏情况与平均情况:

数据结构与算法学习笔记(一)

瘦欲@ 提交于 2019-12-18 13:46:31
我们把数据结构分为 逻辑结构 和 物理结构 逻辑结构:是指数据对象中数据元素之间的相互关系。 物理结构:是指数据的逻辑结构在计算机中的存储形式。 四大逻辑结构: 集合结构:集合结构中的数据元素除了同属于一个集合外没有其他的相互关系。 线性结构:线性结构中的数据元素之间是一对一的关系。 树形结构:树形结构中的元素之间存在一种一对多的层次关系。 图形结构:图形结构的元素之间是多对多的关系。 物理结构:物理结构主要研究如何把数据元素存储到计算机的存储器中。 数据元素的存储形式: 顺序存储:把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。 链式存储:把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不联系的。链式存储中,数据元素的存储关系并不能反映其逻辑关系,因此需要一个指针存放数据元素的地址,这样子通过地址就可以找到相关联的数据元素的位置。 算法:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 算法的特征: 输入:算法有0个或多个输入。有时算法不需要输入参数,例如printf。 输出:算法至少有一个输出。 有穷性:算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。 确定性:算法的每一个步骤都具有确定的含义,不会出现二义性。算法在一定条件下

数据结构和算法排序之插入排序

大憨熊 提交于 2019-12-18 10:18:29
插入排序: 基本思想:是对欲排序的元素以插入的方式寻找该元素的适当位置,以达到排序的目的,把n个待排序元素看做一个有序表一个无序表,有序表中有一个元素即待排元素中的第一个元素,无序表中有n-1个元素,每次排序从无序表中取出一个元素,与有序表中的元素进行比较,寻找适当位置 package Sort ; import java . text . SimpleDateFormat ; import java . util . Arrays ; import java . util . Date ; //插入排序,从小到大进行排序 public class InsertSort { public static void main ( String [ ] args ) { int [ ] array = { - 1 , 8 , 7 , 2 , 3 , 9 , 4 , 2 , 1 , 6 } ; Date date1 = new Date ( ) ; SimpleDateFormat simpleDateFormat = new SimpleDateFormat ( "yyyy-mm-dd HH:mm:ss" ) ; String date1Str = simpleDateFormat . format ( date1 ) ; System . out . println ( "排序前的时间

数据结构-二叉搜索树(BST binary search tree)

醉酒当歌 提交于 2019-12-18 05:51:32
本文由 @呆代待殆 原创,转载请注明出处: http://www.cnblogs.com/coffeeSS/ 二叉搜索树简介 顾名思义,二叉搜索树是以一棵二叉树来组织的,这样的一棵树可以用一个链表数据结构来表示,每个节点除了key和卫星数据(除了二叉树节点的基本数据以外人为添加的数据,这些数据和树的基本结构无关),还有left、right、parent,分别指向节点的左孩子、右孩子和父节点,如果对应的节点不存在则指向NIL节点(因为最简单的二叉搜索树中的NIL节点里并没有有用的信息,所以在实现的时候简单的指向null也可以,本文的代码部分就会这么处理)。 二叉搜索树的性质 1,任意节点x,其左子树中的key不大于x.key,其右子树中的key不小于x.key。 2,不同的二叉搜索树可以代表同一组值的集合。 3,二叉搜索树的基本操作和树的高度成正比,所以如果是一棵 完全二叉树 的话最坏运行时间为 Θ(lg n ) ,但是若是一个n个节点连接成的 线性树 ,那么最坏运行时间是 Θ( n ) 。 4,根节点是唯一一个parent指针指向NIL节点的节点。 5,每一个节点至少包括key、left、right与parent四个属性,构建二叉搜索树时,必须存在针对key的比较算法。 下面给出一张wiki百科上的二叉搜索树的图示 二叉搜索树的操作 二叉搜索树的基本结构(C++) 1 //节点结构

数据结构与算法--栈、队列(栈)

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-18 02:38:31
hello,everybody. 我们又见面了,这次我们一起来学习数据结构中,非常有意思的两种结构—Stack ,Queue. 首先来学习一下栈: 栈: 限定只在表尾进行删除插入操作的线性表。 顾名思义,栈是一种特殊的线性表。它特殊在什么地方呢?它只能在表尾进行插入或删除操作,又就意味着,它只能是先进后出。给大家举个现实中,利用栈的例子。我们都用浏览器浏览过网页,我们对浏览器的前进后退按钮一定都不陌生。当我们打开第一个网页时,有一个图片链接,于是我们又跳到了第二个网页。此时,又有一个文字链接,我们又跳到了第三个网页。此时,我点击浏览器的后退按钮,我们会回到第二个网页。再点击浏览器的后退按钮,我们又跑到了第一个网页。是不是最先打开的第一个网页,是最后一个恢复的?是不是,先进后出? 看来,我们在学习第二章线性表时,付出的心血没有白费。看看,我在学习栈与队列时,感到很轻松,因为它讲的一些概念,我都掌握了。所以,我们在学习知识时,一定要踏实,耐心。付出一定会有回报的,你用心付出,回报巨大,回报明显。你不用心付出,回报微小,回报不明显。你不付出,只是随意看看,那么当别人说起这些知识时,你也可以装下B。所以,付出是有回报的。只是为了,回报巨大,回报明显,我们需要用心,态度要端正。 我们把允许删除的一端称为栈顶(Top),另一端称为栈底(Bottom). 不含任何数据元素的栈称为空栈

【数据结构与算法】基本概念与术语

爷,独闯天下 提交于 2019-12-18 01:30:35
程序设计=数据结构+算法 数据结构 一:数据 数据:描述客观事物的符号,是计算机可操作的对象,是能被计算机识别,并输入给计算机处理是符号集合。它分为数值类型和非数值类型(如图片、音乐等) ↓ 数据元素:是组成数据的、有一定意义的基本单位。如在人类这个集合里,人为数据元素;在畜类这个集合中,猪、狗等为数据元素。(主要研究) ↓ 数据项:一个数据元素可以由若干个数据项组成,数据项是数据的最小单位。(如人的手、脚、鼻子等) 二:数据结构分为逻辑结构和物理结构 1、逻辑结构:指数据对象中数据元素之间的相互关系。 逻辑结构可以分为以下四种: (1)集合结构:结合结构中的数据元素除同属于一集合外,他们之间没有其他关系 (2)线性结构:数据元素是一对一的关系。 (3)树形结构:数据元素是一对多的关系。 (4)图形结构:数据元素是多对多的关系。 2、物理结构:指数据的逻辑结构在计算机中的储存形式。 存储形式可分为顺序存储和链式储存: (1)顺序存储结构:是把数据元素放在地址连续的存储单元里。 (2)链式存储结构:是把数据元素放在任意的存储单元里。() 三:数据类型 是指一些性质相同的值的集合及定义在此集合上的一些操作的总称。 可分为两种类型: 原子类型:不可再分的基本类型。如字符型、整形 结构类型:由若干个类型集合而成。是可以再分解的。如整形数组是由若干个整形组成的。 四:抽象数据类型

数据结构与算法(六)循环队列——顺序存储结构

孤者浪人 提交于 2019-12-18 01:28:39
循环队列 先不急着给循环队列的定义,先看队列循环存储结构的弊端。 队列顺序存储结构的弊端 队列的顺序存储结构本身是由ArrayList实现的,在数据元素入队的时候,相当于在ArrayList表尾添加元素,在数据元素出队的时候,相当于在ArrayList表头删除元素。很明显,入队的时间复杂度O(1),出队的时间复杂度O(n),线性表增删数据元素时间复杂符都是O(n),但是这个是按平均算的。队列的出队时间复杂度O(n),可不是按平均算的,因为每次出队都是O(n)。 有弊端,就可以换其他思路进行优化 优化一 :为了避免当只有一个元素时,队头队尾重合处理变得麻烦,所有引入两个指针,front指向队头元素,rear指向队尾元,让队头指针和队尾指针随着元素的变化而移动。这样我们入队和出队操作都是O(1)。 问题 :rear指针到了表尾就不能后移了,而且出队front一直后移,前面的空间就浪费了。 优化二 :当队头或队尾指针到达尾部时,如需后移可重新指向表头,就相当于是把线性表首尾相连,变成一个环,指针从尾到头有一个周期性,也就是数线性表长度,指针+1对线性表长度取余就可以完成指针从头到尾的跳跃,这样就解决了空间浪费的问题。 问题 :但是又有新的问题,我们判断队列满和队列空的条件都是(rear+1)%n==front,这里n是线性表的长度,这就没法做正确的判断了。 优化三