数据结构
文章平均质量分 85
跑着的程序员
目前就职于国内某大型企业,从事分布式系统的研发工作,欢迎各位牛人交流,QQ:501968942,邮箱:shenganbeiyang@163.com.
展开
-
数据结构 练习 16-动态规划 1
参考文献 《算法导论》 第15章 所谓“动态规划“”,就是寻求最优解的过程,采用的也是递归的思想,不过与分而治之的区别是:分治法,每个子问题是独立的,只要求出每个字问题,然后合并一下,就可以了;而动态规划虽然也是递归的过程,但子问题不独立,下文将结合例子讲解。根据《算法导论》,动态规划(dynamic programming) 包括一下四个方面:1,描述最优解的结构2,递归定义原创 2013-06-18 16:54:57 · 620 阅读 · 0 评论 -
数据结构-练习4 字符串匹配
字符串匹配是编程常用的技巧之一,特写此博文,一则深入学习之,二则作为一种积累,三则秉承“NO matter whether it is right,show my code and confirm the result”原则。 前段时间 ,也在csdn上看到了一篇 ,但感觉那是高手级别的手法,看起来着实让人不知所以然。 由于本人水平属于原创 2013-05-22 16:17:09 · 1092 阅读 · 1 评论 -
数据结构-练习 18 vector && list
vector的用法vector包括的函数为:英文解析:http://www.cplusplus.com/reference/stl/写了一段程序,测试一下几个常用的函数:#include#include#include#includeusing namespace std;int main(){//初始化vector a(3,7);cout<<"原创 2013-06-21 15:04:31 · 675 阅读 · 0 评论 -
数据结构-练习 10 图的邻接链表的深度和广度搜索
本来打算在数据结构的 练习9 继续写此篇的,以保持连贯性,后来发现,没法写,因为BFS的优先队列,没接触过,只能回头学了,翻开《算法导论》,发现优先队列有堆实现,而堆又不会,牵一发而动全身啊,没办法,只能学了,直接看MIT的《算法导论》视频吧,看看最基本的排序算法,反正早晚要复习到。上一篇博文《数据结构-练习 9 图的存储》介绍了图的存储方式之一,邻接链表。在这里将介绍图的遍历,包括深度优先和原创 2013-07-09 14:57:45 · 978 阅读 · 0 评论 -
数据结构-练习 17 动态规划 2
参考文献《算法导论》LCS问题: 描述,LCS英文:longest common string。中文:最长公共子序列。即找出两个字符串里,最长的子序列。比如:A D F G C 和 B F C 则最长的子序列为F C.对应任意给点俩个字符串,我们尝试给出通用的算法。采用动态规划,因为满足动态规划的特征:1.寻找的是最优问题2.子问题互相间独立3原创 2013-06-20 18:14:52 · 1001 阅读 · 0 评论 -
数据结构 练习 22-并查集以及图的最小生成树
图作为一种复杂的数据结构,前面 简单学习了图的遍历,接下来简单介绍最小生成树。相关概念: 连通图: 对于无向图,任何两个顶点,他们之间都存在一条路径,则该无向图为连通图; 强连通图:对于有向图,图中任意两个顶点之间都存在一条有向路径,则该有向图为强连通图; 连通分量:非连通图中的各个连通子图成为该图的连通分量。原创 2013-07-12 11:11:20 · 829 阅读 · 0 评论 -
数据结构 练习 19-活动选择问题的实现(动态规划 和 贪心)
问题叙述:如下图表示活动的开始和结束时间,s[i],开始时间;f[j]结束时间。现在要进行一些列如下活动,注意每个时间段只能进行一场活动,也就是活动不能同时进行,要求举行的活动次数最多。求调度方法。 老规矩,动态规划,要找出两个问题:1,子问题的最优解;2,子问题是什么。abviously,本问题的最优解为:活动数的次数最多,子问题是:看递推公式设c[i]为第i个 位原创 2013-06-27 13:45:27 · 1760 阅读 · 0 评论 -
常见树的比较
转载:http://www.iteye.com/topic/614070我们这个专题介绍的动态查找树主要有: 二叉查找树(BST),平衡二叉查找树(AVL),红黑树(RBT),B~/B+树(B-tree)。这四种树都具备下面几个优势:(1) 都是动态结构。在删除,插入操作的时候,都不需要彻底重建原始的索引树。最多就是执行一定量的旋转,变色操作来有限的改变树的形态。而这些操作所付出的代价转载 2013-07-02 23:14:49 · 550 阅读 · 0 评论 -
数据结构 练习 20-查找 算法
前言查找分为:静态查找和动态查找。静态查找利用算法查找序列或是集合里是否存在某个元素,而不对序列或是集合做出任何改变;动态查找指查找后往序列或是集合里增加或是删除元素。分类静态查找包括:二分查找,顺序索引表的查找,斐破那楔查找(略),插值(略);动态查找包括:二叉查找树(二叉排序树),平衡树(AVL),B树。再接下来的部分,我们将依次分析二分查找,索引查找,二叉原创 2013-07-03 16:07:15 · 655 阅读 · 0 评论 -
数据结构 练习21-trie的原理分析和应用
前言今天具体分析一下trie树,包括:原理分析,应用场合,复杂度分析,与hash的比较,源码展现。大部分内容来自互联网,文中会注明出处。原理分析主要是hash树的变种,先看下图:每一个点存储一个字符,所以trie(字典树)的key不是每个字符串,而是一条链。其原理就是充分利用了公共字符串,这样在查找时,就不需要做重复工作了。并且查找的复杂度可以维持在O(len),len为字符串原创 2013-07-05 17:01:49 · 846 阅读 · 0 评论 -
数据结构-练习 5 二叉树的建立 遍历
二叉树是数据结构的最重要的内容之一,之所以引入二叉树,是因为良好的数据结构非常有助于数据的排序,查询等操作,也是在空间和效率上做个平衡!! 二叉树的定义:每个节点至多有俩颗子树(即二叉树中不存在度大于2的节点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。(摘自《数据结构 c语言》严蔚敏 版,若有维权,可发送至:shenganbeiyang@163.com,本人将立即删除)原创 2013-05-24 16:03:37 · 2259 阅读 · 0 评论 -
链表反向,
链表反向:template class Node { public: T data; Node* next;};template class link{public:link(){ head=new Node();head->data=1;head->next=NULL;Node* pNew=NULL;Node* p=原创 2013-09-09 14:46:09 · 621 阅读 · 0 评论 -
数据结构-练习 9 图的存储 之邻接链表
前言:图是树的扩展,本博文主要讲述图的存储。 图的存储包括:图的邻接矩阵,图的邻接链表,以及十字链表。 1,图的邻接矩阵,无非开辟一个一维数组和一个二维数组。一维数组用于存放图的顶点信息,二维数组用于存放图的连接信息,之前做过一个传感网的项目。记得是用一个二维数组存放路由之间的信息的,因为路由的信息是无向的,所以当时只用了一半。这个很简单,直接跳过;原创 2013-06-07 13:12:06 · 2574 阅读 · 0 评论 -
数据结构练习 14- 线性时间排序
线性时间排序,我们主要分析三类排序:基数排序,计数排序和桶排序一,桶排序。桶排序跟hash的思想如出一辙。桶排序的意思就是造桶,桶的意思其实就是开辟一个新的数组空间。核心思想是:把数值映射成数组的坐标值。大概原理如下:假如存在如下序列:1 3 5 6 4则开辟一个大小为7(0-6)的空间。然后把1存在新开辟数组的位置1处,表格2所示,取出表格2里的数据我们发现为:原创 2013-06-16 11:58:23 · 606 阅读 · 0 评论 -
数据结构联系 15-希尔排序 选择排序
shell排序,是插入排序的改进算法,采用分组插入。直接上例子吧,不懂插入排序的见我的博文插入排序。如例子 9 1 5 8 3 7 2 4 5取梯度:1, 5, 19, 41, 109......因为 number of element is 9第一回合:i=0,取9和7(i+梯度5得到元素7),9,7 插入排序后得7,9所以原数组变为:原创 2013-06-16 20:09:21 · 614 阅读 · 0 评论 -
WM_COMMAND
当用户点击菜单、按钮、下拉列表框等控件时候,会触发WM_COMMANDLOWORD(wParam) 是控件或菜单或加速键的ID,菜单的sparator的ID为0如果LOWORD(wParam) 是控件ID,HIWORD(wParam)是notification code, 比如BN_CLICKED, BN_DBLCLK等,标志用户对控件的操作,双击,单击之类。如果LOWORD(wParam) 是菜转载 2012-02-12 14:28:42 · 397 阅读 · 0 评论 -
面试 准备之 字符串: Append
我们知道,面试中经常出现对字符串的操作,看起来简单的函数实现,其实做起来还是有点难度的,加之,是在比较紧张的氛围下。一行漂亮的代码可以让面试官眼睛一亮。 先来看看Append函数吧!先上写好的代码吧(给予VS2008开发的)char* CharAppend( char* sourceChar1,char *sourceChar2)//分别传入要拼接的两个字符串,{int i=0原创 2013-05-05 14:47:16 · 686 阅读 · 1 评论 -
面试 准备之 atoi
atoi:将字符串转换成整型数;atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符串时('\0')才结束转化,并将结果返回(返回转换后的整型数)。/* email:shenganbeiyang@163.com QQ:501968942*/#include "iostream"using namesp原创 2013-05-24 11:03:50 · 887 阅读 · 0 评论 -
数据结构-练习6 线索二叉树的建立和遍历
前面一篇博客讲述了二叉树的建立和遍历,无论是前序还是中序或是后序,只不过是访问数据的顺序不一样,是为了访问二叉树而人为化的一种链式“形”,突出的是访问的内在联系。同样地,线索化的二叉树也是,在前驱和后继之间建立起一种联系,从而使访问特别快,特别方便。 线索化二叉树是在二叉树的序(前,中,后)的基础上建立起来的。其关键是利用空闲的lchild和rchild存储其前驱和后继,对于度为2原创 2013-05-28 17:32:52 · 1627 阅读 · 0 评论 -
数据结构-练习1 数组排序
一: 题目,给定非递减的数组,组合成一个非递减的数组,如数组A:1,2,2,3。B:1,3,4。组合后的数组为:1,1,2,2,3,3,4. 我们知道,数组排序评价标准是时间复杂度。废话不多说 ,上代码: 平台是VS2008include"iostream"using namespace std;void AdjustArray原创 2013-05-14 21:51:45 · 728 阅读 · 1 评论 -
数据结构-练习3 队列的数组实现
我们知道,队列是使用的最常见的数据结构之一。常用的队列的实现有两种方法,数组和链式结构。下面用数组实现以下queue。包括的实现函数: enqueue(T x) 压入队列。 getqueue() 获取队列元素,但不取出队列 r原创 2013-05-19 23:03:11 · 1173 阅读 · 1 评论 -
数据结构-练习 12 堆以及最优队列的实现
堆排序是最重要的排序算法之一,在平时的开发以及面试中经常会用到。堆的特点是: 1,有一颗完全二叉树构成,如图1; 2,可分为最大堆和最小堆。最大堆的意思就是:任何根节点的数据不小于左右孩子节点的数据;反之,最小堆的意思就是任何节点的数据不大于左右孩子节点的数据; 3,堆排序的算法复杂度为O(NlgN),比冒泡和插入快,究其原因在于堆只维原创 2013-06-13 16:20:14 · 1337 阅读 · 0 评论 -
数据结构-练习7 huffman编码
huffman编码是重要的编码方式之一。作为一名程序员,应该要做到融会贯通,因此我在网上搜些资料看,发现几乎没有适合我等菜鸟级的文章,不是没有图解,就是不说明为什么要引入huffman编码,稀里糊涂,于是自己整理了一下,欢迎诸君拍砖。 Huffman是一种无损压缩方法:所谓无损就是不会有信息丢失,可以100%恢复原信号,像奈奎斯特恢复原创 2013-06-03 13:24:52 · 1190 阅读 · 0 评论 -
数据结构-练习2 哈希表
哈希表是常用的数据结构,也是经常的面试题之一,所以程序员应该掌握并在平时的程序中使用它。下面简单实现一个哈希表。 比如:数组 a=[3,6,1,5,9,10,100,34],现在要查找元素100,最笨的算法就是挨个遍历,算法复杂度是O(N),但是要是在平时程序中轻易写出这样的代码,恐怕得被挨批,对于排序,查找之类的,我们首先应该想到的是hash,因为其复杂度是常数级别的。原创 2013-05-18 12:38:15 · 1265 阅读 · 0 评论 -
数据结构-练习 8 八皇后问题
八皇后问题是找到8*8里那个特定的情形,即8个皇后不能互相攻击,不能同行,不能同列,也不能正反斜对。 此问题是对所有问题依次进行遍历,查看是否满足条件。以4*4 为例子。原创 2013-06-05 16:03:55 · 1706 阅读 · 0 评论 -
数据结构-练习 13 快排
快速排序的思想是平常最常用的排序算法之一,因其平均复杂度为NlgN而著称,并且可以不借助其他空间。下面我们就来学习一下快排。 看看原理吧。 快速的排序采用了分而治之的思想。选取一个基元,分别与之比较,进行一次partition,再循环进行。 原理图解如下:假设以6为基元, i,原创 2013-06-15 14:49:58 · 952 阅读 · 0 评论 -
数据结构-练习 11 冒泡排序 插入排序 归并排序
本博文介绍三中最基本的排序算法,冒泡,插入,归并。 一,冒泡:最简单,也是最直接的排序算法,从前往后,每个元素都与其后满足条件的元素交换。时间复杂度O(N^2)。代码如下: #includeusing namespace std;void sort(int*a,int n){ int temp; for(int i=0;i<n;++i)原创 2013-06-12 09:42:00 · 1101 阅读 · 0 评论