数据结构
文章平均质量分 85
AC_XXZ
努力了不一定会成功,但不努力肯定会失败
展开
-
堆和栈的区别
一、预备知识―程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)― 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) ― 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态原创 2014-10-28 20:41:38 · 1021 阅读 · 0 评论 -
白话经典算法系列之四 直接选择排序及交换二个数据的正确实现
直接选择排序和直接插入排序类似,都将数据分为有序区和无序区,所不同的是直接播放排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选一个最小的元素直接放到有序区的最后。 设数组为a[0…n-1]。1. 初始时,数组全为无序区为a[0..n-1]。令i=02. 在无序区a[i…n-1]中选取一个最小的元素,将其转载 2014-12-10 16:10:18 · 857 阅读 · 0 评论 -
白话数据结构之【最小生成树】
基本概念:1:什么是生成树?对于图G,如果其子图G'满足V'=V,且G'是一棵树,那么G'就是图G的一颗生成树。生成树是一棵树,按照树的定义,每个顶点都能访问到任何一个其它顶点。(离散数学中的概念),其中V是顶点,E是边,通俗来讲生成树必须包含原图中的所有节点且是连通的比如 2:最小一个无向连通图G=(V,E),最小生成树就是联结所有顶点的边的权值和最小时的子图T,此时原创 2015-01-18 19:59:50 · 1893 阅读 · 0 评论 -
优先级队列优化的霍夫曼编码(带中文压缩)
利用STL中的优先级队列进行优化我将压缩和解压分为两部分,其实一些还是是一样的压缩的时候通过bitset将每8个01串压缩成一个字节,如果最后一个不满足8个,用0补齐,但是要记录最后一个字节实际有多少个有效位,将其存入文件最后一个字节,解压的时候先将文件定位到最后一个字节,取出有效位的个数,压缩文件真正有效的是倒数第二个字节,倒数第一个字节只是记录倒数第二个字节中有几位是有效的,解压的时候原创 2015-01-03 17:03:13 · 1877 阅读 · 0 评论 -
UVA10007(计算二叉树形态的个数)
n节点组成二叉树的个数可以分析,当n=1时,只有1个根节点,则只能组成1种形态的二叉树,令n个节点可组成的二叉树数量表示为h(n),则h(1)=1; h(0)=0; 当n=2时,1个根节点固定,还有2-1个节点。这一个节点可以分成(1,0),(0,1)两组。即左边放1个,右边放0个;或者左边放0个,右边放1个。即:h(2)=h(0)*h(1)+h(1)*h原创 2015-02-09 18:14:47 · 1291 阅读 · 0 评论 -
KMP求next数组详解
我们在一个母字符串中查找一个子字符串有很多方法。KMP是一种最常见的改进算法,它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,加快匹配速度。当然我们可以看到这个算法针对的是子串有对称属性,如果有对称属性,那么就需要向前查找是否有可以再次匹配的内容。 在KMP算法中有个数组,叫做前缀数组,也有的叫next数组,每一个子串有一个固定的next数组,它记录着字符串匹配过程中失配情况转载 2015-01-05 19:49:55 · 894 阅读 · 0 评论 -
[置顶] 从头到尾彻底理解KMP(2014年8月22日版)
从头到尾彻底理解KMP作者:July时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个多月不断反复改进。1. 引言 本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP,思路混乱导致写也写得混乱。所以一直想找机会重新写下KMP,但苦于一直以来对KMP的理解始终不够转载 2015-01-05 19:52:49 · 951 阅读 · 0 评论 -
白话算法与数据结构之【字典树】
1. 什么是trie树 1.Trie树 (特例结构树) Trie树,又称单词查找树、字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。 Trie的核心思想是原创 2015-06-25 21:11:30 · 1864 阅读 · 1 评论 -
霍夫曼编码/译码器
赫夫曼树的应用 1、哈夫曼编码 在数据通信中,需要将传送的文字转换成二进制的字符串,用0,1码的不同排列来表示字符。例如,需传送的报文为“AFTER DATA EAR ARE ART AREA”,这里用到的字符集为“A,E,R,T,F,D”,各字母出现的次数为{8,4,5,3,1,1}。现要求为这些字母设计编码。要区别6个字母,最简单的二进制编码方式是等长编码,固定采用3位二进制,可分别用0原创 2015-07-09 18:07:46 · 3981 阅读 · 0 评论 -
白话经典算法系列之五 归并排序的实现
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。[cpp] view plaincopy转载 2014-12-10 16:04:26 · 845 阅读 · 0 评论 -
白话经典算法系列之八 MoreWindows白话经典算法之七大排序总结篇
在我的博客对冒泡排序,直接插入排序,直接选择排序,希尔排序,归并排序,快速排序和堆排序这七种常用的排序方法进行了详细的讲解,并做成了电子书以供大家下载。下载地址为:http://download.csdn.net/detail/morewindows/4443208。 有网友提议到这本《MoreWindows白话经典算法之七大排序》电子书讲解细致用来平时学习是非常好的,但是页数转载 2014-12-10 16:30:59 · 1016 阅读 · 0 评论 -
表达式求值
思路:参考严蔚敏的数据结构书籍两个栈:操作数栈OPND,操作符号栈OPTR在表达式后加=符号栈初始化时=入栈每读一个字符:当它是#并且符号栈栈顶也是#时结束算法当它是操作数时,进数栈当它是符号时:1.如果符号栈顶的优先级小于它,进符号栈2.如果符号栈顶的优先级大于它,出两个数,出一个符号,计算后入数栈3.如果与符号原创 2014-10-31 20:43:11 · 1019 阅读 · 0 评论 -
括号匹配系列(栈的运用)
题目描述:一个括号序列是指一个由'(', ')', '[', ']'四种字符组成的字符串。一个只包含数字,加号'+',和上述四种括号的合法算数表达式,去掉数字和加号之后得到的括号序列成为合法的括号序列。我们定义空串也是合法的括号序列。例如(1) + [2], ([3]), 4 + [5]相应的括号序列 "()[]", "([])", "[]"都是合法的括号序列。而(6 + 7],原创 2014-10-06 21:21:44 · 2326 阅读 · 4 评论 -
二叉树的遍历
二叉树的遍历有三种方式,如下:(1)前序遍历(DLR),首先访问根结点,然后遍历左子树,最后遍历右子树。简记根-左-右。(2)中序遍历(LDR),首先遍历左子树,然后访问根结点,最后遍历右子树。简记左-根-右。(3)后序遍历(LRD),首先遍历左子树,然后遍历右子树,最后访问根结点。简记左-右-根。 例1:如上图所示的二叉树,若按前序遍历,则其输出序列为原创 2014-10-28 20:34:05 · 1343 阅读 · 1 评论 -
白话经典算法系列之六 快速排序 快速搞定
快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快速转载 2014-12-10 15:30:24 · 761 阅读 · 0 评论 -
白话经典算法系列之三 希尔排序的实现
希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很转载 2014-12-10 16:25:09 · 722 阅读 · 0 评论 -
白话经典算法系列之七 堆与堆排序
堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法。学习堆排序前,先讲解下什么是数据结构中的二叉堆。二叉堆的定义二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。当父结点的键值总转载 2014-12-10 15:43:18 · 919 阅读 · 0 评论 -
白话经典算法系列之一 冒泡排序的三种实现
直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。 设数组为a[0…n-1]。1. 初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=12. 将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。转载 2014-12-10 16:29:17 · 851 阅读 · 0 评论 -
白话经典算法系列之二 直接插入排序的三种实现
直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。 设数组为a[0…n-1]。1. 初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=12. 将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。转载 2014-12-10 16:27:22 · 783 阅读 · 0 评论 -
排序算法总结
排序算法分为两类: 1:基于比较的排序,这一类排序算法的下限是O(nlogn)2: 非基于比较的排序,这一类排序算法可以突破下限时间复杂度可以达到O(n),比如:计数排序,桶排序,和在此基础上的基数排序下面这个表格总结了各种排序算法的复杂度与稳定性:一:冒泡排序void BubbleSort(int a[], int n) { int i, j; for (i = 0;原创 2016-09-17 22:12:52 · 772 阅读 · 0 评论