03 2014 档案
图解数据结构树之AVL树
摘要:AVL树(平衡二叉树): AVL树本质上是一颗二叉查找树,但是它又具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为平衡二叉树。下面是平衡二叉树和非平衡二叉树对比的例图: 平衡... 阅读全文
posted @ 2014-03-31 20:21 水目沾 阅读(49042) 评论(1) 推荐(4)
排序算法之选择排序
摘要:选择排序算法简介: 选择排序是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。选择排序算法复杂度分析: 选择排序的交换操作介于0和(n - 1)次之间... 阅读全文
posted @ 2014-03-31 15:08 水目沾 阅读(368) 评论(0) 推荐(0)
数据结构树之二分查找树
摘要:二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;任意节点的左、右子树也分别为二叉查找树。没有键值相等的节点(no duplicate nodes)。二叉查找树的性质: 二叉查找树本质上是一种二叉树,所以上章讲的二叉树的性质他都有。二叉查找树的思想: 二叉排序树的查找过程和次优二叉树类似,通常采取二叉链表作为二.. 阅读全文
posted @ 2014-03-30 23:45 水目沾 阅读(2397) 评论(0) 推荐(0)
数据结构树之二叉树
摘要:二叉树的定义: 是一颗空树或者具有以下性质 1.结点最多只有两个孩子,且有左右之分。不能交换左右孩子 2.结点点的左子树和右子树也是二叉树。例图 二叉树的基本形态:二叉树中的术语: 1).结点度:节点所拥有的字数的个数成为该节点的度,在二叉树中度的取值只能是0,1,2. 2).叶节点:度为0的节点成为叶结点或终端结点。 3).左孩子、右孩子、双亲:树中一个结点的子树的根结点称为这个结点的孩子。这个结点称为它孩子结点的双亲。具有同一个双亲的孩子结点互称为兄弟。 4).路径、路径长度:如果一棵树的一串结点n1,n2,…,nk有如下关系:结点ni是ni+1的父结点(1≤i... 阅读全文
posted @ 2014-03-30 16:03 水目沾 阅读(619) 评论(0) 推荐(0)
排序算法之希尔排序
摘要:希尔排序算法简介: 希尔排序属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序。 排序过程:先取一个正整数d1 2 3 using namespace std; 4 5 //希尔排序 6 void shellSort(int iarr[],int length) 7 { 8 int dt[3] = {5,3,1},i =0 ,j,k,temp; 9 for(j = 0; j = 0)16 {17 iarr[k + dt[j]] = iarr[k];18 k -= dt... 阅读全文
posted @ 2014-03-29 11:04 水目沾 阅读(1794) 评论(0) 推荐(0)
排序算法之插入排序
摘要:插入排序算法简介: 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外,而第二部分就只包含这一个元素。在第一部分排序后,再把这个最后元素插入到此刻已是有序的第一部分里的位置插入排序算法思想: 一般来说,插入排序都采用in-place在数... 阅读全文
posted @ 2014-03-28 22:50 水目沾 阅读(321) 评论(0) 推荐(0)
排序算法值快速排序
摘要:快速排序算法: 快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序思想: 设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面, 这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就... 阅读全文
posted @ 2014-03-28 11:26 水目沾 阅读(329) 评论(1) 推荐(0)
排序算法之堆排序
摘要:前言:今天我来介绍下堆排序,在写堆排序代码之前,我们要知道堆的概念! 堆的定义:n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质): (1)ki=号。//k(i)相当于二叉树的非叶子结点,K(2i)则是左子节点,k(2i+1)是右子节点若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树: 树中任一非叶子结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。 堆的分类: 1).大根堆和小根堆:根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最小者的堆称为小根堆,又称最小堆... 阅读全文
posted @ 2014-03-28 10:02 水目沾 阅读(608) 评论(1) 推荐(0)
排序算法之归并排序
摘要:归并排序 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。值得注意的是归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。比较 归并排序是稳定的排序.即相等的元素的顺序不会改变.如输入记录 1(1) 3(2) 2(3) 2(4) 5(5) (括号中是记录的关键字)时输出的 1(1) 2(3) 2(4) 3(2) 5(5) 中的2 和 2 是按输入的顺序.这对要排序数据包含多个信息而要按其中的某一个信息排序.. 阅读全文
posted @ 2014-03-28 00:47 水目沾 阅读(282) 评论(0) 推荐(0)
排序算法之冒泡排序
摘要:参考:http://baike.baidu.com/view/254413.htm算法原理 冒泡排序算法的运作如下:比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 时间复杂度 若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值。 所以,冒泡排序最好的时间复杂度为O(n)。 若初始文件是反序的,需要进行n2趟排... 阅读全文
posted @ 2014-03-27 20:53 水目沾 阅读(471) 评论(0) 推荐(0)
面试试题
摘要:第一题:通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。 压缩规则: 1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。 2、压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。 下面是我写的代码: 1 #include 2 3 using namespace std; 4 5 void string 阅读全文
posted @ 2014-03-25 20:53 水目沾 阅读(260) 评论(0) 推荐(0)
C++学习之容器的摸索
摘要:初学容器,容易犯错的地方1.vector,list和deque都是顺序容器。其中vector和deque都可以通过下标访问,而list不能2. 容器的begin和end操作 c.begin()返回一个迭代器,它指向容器c的第一个元素 c.end()返回一个迭代器,它指向容器c的最后一个元素的 c.rbegin()返回一个逆序迭代器,它指向容器c的最后一个元素 c.rend()返回一个逆序迭代器,它指向容器c的第一个元素的前面一个元素 注意以上操作的返回的迭代器类型,前两个是iterator,后面一个是reverse_iterator。乱了顺序是不行的请看下面一段代码: 1 #inc... 阅读全文
posted @ 2014-03-18 20:18 水目沾 阅读(213) 评论(0) 推荐(0)
C++ primer读书笔记 chapter3 标准库类型
摘要:除第二章介绍的是C++的基本类型,本章将大致介绍一下C++定义的内容丰富的抽象数据库类型标准库。着重介绍一下sting、vector和bitset。3.2标准库string类型 1.string类型支持几个构造函数。构造函数是一个特殊成员函数,定义如何初始化该类型的对象,以下是string类型常用的构造函数。当没有明确指定对象初始化式时,系统将调用默认构造函数几种初始化string对象的凡是string s1默认构造函数,s1为空串string s2(s1)将s2初始化为s1的一个副本string s3(s2)将s3初始化为一个字符从字面值副本string s4(n,'c')将 阅读全文
posted @ 2014-03-18 19:38 水目沾 阅读(148) 评论(0) 推荐(0)
C++ Primer 随笔 Chapter 2 变量和基本类型
摘要:2.1C++内置类型C++ 算术类型类型含义最小存储空间(随机器不同而不同)bool布尔型---char字符型8位wchar_t宽字符型 16位short短整型16位int整型32位long长整型64位float单精度浮点型6位有效数字double双精度浮点型10位有效数字long double扩展双精度10位有效数字 以上就是C++定义的几种基本类型,但是我们可以根据这几种最基本的类型派生出任意我们想要的类型,比如vector,string之类的!几种基本类型中除了bool型外,其他的都分为带符号(signed)的和不带符号(unsigned)的。顾名思义,unsigned类型只能表示整数. 阅读全文
posted @ 2014-03-12 21:18 水目沾 阅读(267) 评论(0) 推荐(0)
比较全面的gdb调试命令 (转载)
摘要:转自http://blog.csdn.net/dadalan/article/details/3758025用GDB调试程序 GDB是一个强大的命令行调试工具。大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本。UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能。 于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合成更为强劲的功能。而Windows下的图形软件基本上是各自为营,互相不能调用,很不利于各种软件的相互集成。在这里并不是要 阅读全文
posted @ 2014-03-12 11:14 水目沾 阅读(318) 评论(0) 推荐(0)
open和fopen的区别(转)
摘要:转载自:http://www.cnblogs.com/joeblackzqq/archive/2011/04/11/2013010.htmlopen和fopen的区别:1.缓冲文件系统缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”, 装满后再从内存“缓冲区”依此读入接收的变量。执行写文件的操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。由此可以看出,内存 “缓冲区”的大小,影响着实际操作外存的次数,内存“缓冲区”越大,则操作外存的次数就少,执行速度就快、效率高。一般来说,文件“缓冲区”的 阅读全文
posted @ 2014-03-09 13:34 水目沾 阅读(312) 评论(0) 推荐(0)
来了
摘要:我又重新回来了!oh,yeah! 阅读全文
posted @ 2014-03-04 15:09 水目沾 阅读(139) 评论(1) 推荐(0)