数据结构与算法
文章平均质量分 76
bluesky_03
ios/android,多媒体、网络,算法与设计模式
展开
-
链表简例
链表的优势是,可以快速插入和删除一个结点。获得这种优势的代价是,每个结点除了要存放核心的信息外(这不是代价),还要存入至少一个非核心却是必须的链接(代价)。链表没a[i]优势,数组有。C++的指针是链接的一种实现方式。链接还可以用索引,ID等来实现。N个人围在成一个圈子,从第一位开始数数,数到M的出列,求最后一个。以下是用循环链表实现的一个例子://// test in vc++ 8.原创 2008-04-29 14:33:00 · 403 阅读 · 0 评论 -
单链表,实现逆转
#include using namespace std;#include struct node { int data; node * next;public: node(int d, node* n) { data = d; next = n; }};class list{public: list( ); virtual ~list( );public: void in原创 2009-01-05 22:10:00 · 839 阅读 · 1 评论 -
栈的应用--算术表达式求值
选择栈作为数据结构,所以所有操作都要围绕栈的特点来进行。因为先入栈而被压在下面的意味着要后处理,所以优先级低的不能压着优先级高的而入栈。对于同级的操作符,因为要按照从左往右的运算规则,所以也不能压着同级的操作符而入栈。简单来说,与栈顶的操作符比较,优先级高的则入栈,否则操作符出栈作相应运算。本算法使用两个栈,一个用来存放操作符,一个用来存放操作数和运算的结果。因为比较优先级是必须做的事原创 2008-09-08 16:19:00 · 2463 阅读 · 0 评论 -
排序3
//快速排序之确定划分点{逻辑结构:线性表}算法思想:1。假设对线性表List[p..r]确定划分点。定义位序变量i,j。i始终指向已处理的元素列表的末尾,即元素List[p..i]均不大于List[r]。j始终指向当前要处理的元素,即元素List[(i+1)..(j-1)]均大于List[r]。2。i = p - 1。j = p。3。当j4。如果List[j]5。j=j+1。转至步骤3。6。交原创 2008-08-25 19:22:00 · 470 阅读 · 0 评论 -
排序2
//最大堆的调整{逻辑结构:树状结构--完全二叉树}{存储结构:顺序表--数组即可反映逻辑结构}算法思想:1。前置条件:当前结点i的左子树和右子树都已经是最大堆;设堆的大小为n。2。结点i左结点的下标l=2*i;结点i右结点的下标r=2*i+1。3。在l4。如果l结点的值大于i结点的值,则把largest记为l,否则记为i。5。如果r结点的值大于i结点的值,则把largest记为r。6。如果lar原创 2008-08-25 19:18:00 · 371 阅读 · 0 评论 -
排序4
//计数排序//说明:不同与比较排序算法,计数排序算法不涉及到数据元素间的比较。计数排序适用于小范围集中的数据的排序,它以空间换取时间,能达到线性的时间复杂度。计数排序关键一点是:对于每一个元素x,确定有多少个元素不大于它---假设有n个元素小于或等于x(包括了x),则把x放在位序为n的地方即可。实际中,此算法很可能没快排和堆排好。//算法思想:{线性表}1。假设原始数据为ListA,数据的原创 2008-08-25 19:27:00 · 609 阅读 · 0 评论 -
排序1
[] 表示一个块{} 表示注释kernel_code kernel_code只考虑最一般的、最基本的情况,不作输入等检查,它不应该给外界直接调用。//插入排序{逻辑结构:线性表}算法思想:1。从第二个元素开始,依次取出各个数据元素。2。取出的数据元素跟已经有序的序列作比较,从右往左,至到所有数据比较完毕,或找到一个比取出元素要小的元素为止,设这个元素的位序为i。3。把取出的数据元素插入原创 2008-08-25 19:16:00 · 489 阅读 · 0 评论 -
递归
递归是很基本的算法,它体现了分而治之的思想。每次递归调用都意味着部分数值要压入栈中(系统维护了一个下压栈),这是跟迭代的区别,因为在迭代中每次循环结束时所有局部变量都获得了释放。所以使用递归算法必须考虑它的深度,考虑是否会造成栈溢出,与及对效率造成的影响。每一次递归调用,问题的规模都应该有所减少,并最终达到终止条件的要求,从而结束递归调用。树和链表都是递归定义。递归是自顶向下的算法。递归理论上的正原创 2008-08-06 20:12:00 · 515 阅读 · 0 评论 -
单链表排序
链表的一个特点,就是当你拥有一个结点的链接时就拥有一个链表。这里的例子使用哑元头结点,实现一个单链表元素的升序排列。排序时使用两个链表,一个是原始的含有要排序元素的,一个是新的用来存入排序结果的。排序时,原来链表顺序扫描直到结束;每扫到一个就到新链表中去顺序扫描直到找到一个比它大的元素或扫描完,然后把这个原链表中的结点挂到新链表中去。////vc++ 8.0 console applica原创 2008-05-06 20:22:00 · 6520 阅读 · 1 评论 -
一般的trie树
trie树是一个字典,可以容纳大量的字符串,可以快速查找某个特定的字符串或它的前缀。trie树以空间换时间,但空间上的浪费还是很明显的,必要时可以考虑优化trie树,如使用双数组的trie树,以节省空间。trie树的优势的基础是数组的a[i]优势。trie树查找一个字符串的最差的时间复杂度是O(h),h是树的高度,这时未必就比二分法好,更没有B树快。trie树有一个基本数组,数组的每一原创 2008-05-05 20:01:00 · 2294 阅读 · 0 评论 -
单向链表逆转
以下例子演示逆转一个单向链表://// test in vc++8.0 xp#include #include using namespace std;struct Node { int item; Node* next; Node( int item_info, Node* pLink ) : item(item_info), next(pLink) { }};type原创 2008-04-28 20:30:00 · 910 阅读 · 0 评论 -
数组
存储块就是一个数组,它是根据基址和偏移地址来寻址的,而数组也是这样。数组的优势是a[i]。因为数组跟存储块有着惊人的相似之处所以数组能够根据索引(相对位置)快速的访问到其中的元素,这就是数组的a[i]优势(a[i]就简单的对应几条机器指令)。数组的特点是:物以类聚,元素都是同一种类型。左邻右舍,线性连续存储。C/C++语言中的数组不支持下标越界检查,即数组越界时不会抛出异常,程序无法捕原创 2008-04-24 17:26:00 · 499 阅读 · 0 评论 -
循环队列
如果队列的结构是单向的(如数组或单向链表),则经过若干队尾进、队头出之后,很可能会造成队列还没满却被认为已满或浪费空间的情况。为了解决这一个问题,可以使用循环队列。使用循环队列的话,要解决判空和判满的条件的设定的问题,这里有几种解决方案:1。rear指向队列的最后一个元素,front指向队列第一个元素的前一个位置,且这个位置保留不允许插入元素。在插入一个元素之前,如果(rear + 1)原创 2009-01-05 22:05:00 · 1352 阅读 · 0 评论