
Data Structures
文章平均质量分 77
Arcsinsin
这个作者很懒,什么都没留下…
展开
-
UVA 112 Tree Summing
二叉树基础题1. 去空格 2.由括号表达式建树(用两个栈) 3.搜索此题先是参考了下别人的代码,算是基础的练习+复习。#include#include#include#includeusing namespace std;const int maxn = 10000;struct Node{ int data; Node *left, *right;原创 2013-01-23 22:28:18 · 674 阅读 · 0 评论 -
单链表的逆置-C++实现
对于单链表的逆置有两种方法可以实现:(1)利用辅助指针 基本思想:在遍历结点过程中,设置辅助指针,用于记录先前遍历的结点。这样依次编译的过程中只需修改其后继结点的next域即可。 实现代码:[cpp] view plaincopyprint?typedef int DataType; /转载 2013-08-29 22:00:50 · 1231 阅读 · 0 评论 -
单链表带头结点&不带头结点
Node *head; //声明头结点带头结点初始化void InitList(Node **head){ *head=(Node *)malloc( sizeof(Node)); (*head)->next=NULL;}带头结点尾插入,统一操作方式一:void CreatList(Node原创 2013-08-30 10:14:01 · 1278 阅读 · 0 评论 -
循环队列
---------------------------------------------------------------------------------我见过的循环队列写得基础、详细、清晰的好文章!必转!收藏!---------------------------------------------------------------------------------转载 2013-09-02 17:48:10 · 1606 阅读 · 0 评论 -
二叉树的非递归遍历
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。一.前序遍历转载 2013-09-11 10:28:36 · 922 阅读 · 0 评论 -
KMP算法详解(精华)
主要看了这里,感觉讲的十分的不错,总结一下。首先声明要搜索的串为S,设长度为n,要匹配的串为M,设长度为m.先考虑暴力的算法,暴力的算法是遍历S的每一个字符,然后从这个字符开始和M串进行匹配。时间复杂度为O(nm).怎么在此基础上进行优化?假设现在从某个位置(设为s)开始和M串进行匹配,如果匹配不成功,暴力算法是从这个位置的下一个位置(s+1)进行匹配,直观上来说就是匹配的转载 2013-09-05 11:28:21 · 1341 阅读 · 0 评论 -
uestc oj 1035 论文搜索(子串查找)
链接:http://www.acm.uestc.edu.cn/problem.php?pid=1035代码:#include#include#includeusing namespace std;int main(){ int t, n; char keyword[21], title[101]; while (scanf("%d",&t) == 1) { wh原创 2013-09-29 15:35:07 · 1797 阅读 · 0 评论 -
丑数
诺西笔试最后一道题,题意:把只包含质因子2、3和5的数称作丑数(Ugly Number),例如:2,3,4,5,6,8,9,10,12,15,等,习惯上我们把1当做是第一个丑数。写一个高效算法,返回第n个丑数。最普通(也最耗时)的做法是从1开始遍历,然后判断这个数的因式分解中只包含2,3,5,满足则找到了一个,一直找下去,直到第n个被找出!测试了一下,找第1500个丑数耗时40秒!原创 2013-10-02 22:27:57 · 1160 阅读 · 0 评论 -
归并排序
归并排序是利用递归和分而治之的技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列,归并排序包括两个步骤,分别为: 1)划分子表 2)合并半子表 首先我们来讨论归并算法,归并算法将一系列数据放到一个向量中,索引范围为[first,last],这个序列由两个排好序的子表构成,以索引终点原创 2013-09-21 09:58:38 · 1492 阅读 · 0 评论 -
求数组的子数组之和的最大值
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。编程之美上的题,题目的详细分析看书去。这里,主要提一下需要注意的地方和经常遇到的几种变形。需要关注的就是A[i], A[i] + Start[i+1] , All[i+1]这3个数的大小。公式:All[i] = max(A[i], A[i] +原创 2013-10-06 21:49:54 · 1035 阅读 · 0 评论 -
冒泡排序的多种写法
一、void BubbleSort(int[] array){ int length = array.Length; for (int i = 0; i <= length - 1; i++) { for (int j = length - 1; j > i; j--) { if (array[j] < arra原创 2013-08-29 11:27:43 · 4203 阅读 · 0 评论 -
二叉排序树的删除
(网上讲二叉排序树删除的资料很少,这篇很不错!)二叉排序树的删除: 对于一般的二叉树来说,删去树中的一个结点是没有意义的,因为它将使以被删除的结点为根的子树变成森林,破坏了整棵树的结构但是,对于二叉排序树,删去树上的一个结点相当于删去有序序列中的一个记录,只要在删除某个结点后不改变二叉排序树的特性即可。 在二叉排序树上删除一个结点的算法如下:btree *转载 2013-08-23 19:05:34 · 27886 阅读 · 4 评论 -
二叉堆
二叉堆这种数据结构对于优先队列的实现是如此的普遍。二叉堆有两个性质:结构性和堆序性。二叉堆的定义:二叉堆是一棵完全二叉树。底层上的元素看做从左到右填入。二叉堆简称堆。因为完全二叉树很有规律,所以它可以用一个数组来表示而不需要指针。对于数组上任一位置i的元素,其左儿子位置为2i,右儿子位置(2i+1)。则它的父亲在位置[ i / 2]上。所以堆这种数据结构原创 2013-01-29 16:27:06 · 1066 阅读 · 0 评论 -
UVA 673 Parentheses Balance
链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=614//栈的简单应用。用结构体也可以实现。#include#include#includeusing namespace std;const int maxn = 130;原创 2013-01-20 16:25:59 · 646 阅读 · 0 评论 -
线段树入门
在自然数,且所有的数不大于30000的范围内讨论一个问题:现在已知n条线段,把端点依次输入告诉你,然后有m个询问,每个询问输入一个点,要求这个点在多少条线段上出现过;最基本的解法当然就是读一个点,就把所有线段比一下,看看在不在线段中;每次询问都要把n条线段查一次,那么m次询问,就要运算m*n次,复杂度就是O(m*n)这道题m和n都是30000,那么计算量达到了10^9;而计原创 2013-02-28 08:24:35 · 632 阅读 · 0 评论 -
线段树着色问题
线段树节点记录区间左右坐标和区间颜色如果父节点i表示[left, right],那么父节点的左节点i*2表示区间[left, mid],有节点表示[mid+1, right],其中mid为left和right的中点所有的节点存在tree数组里面叶节点表示一个点,即区间左右坐标是一样的根节点代表区间[1, l]三个主要操作:建树:初始化函数init()原创 2013-02-28 11:48:44 · 1056 阅读 · 0 评论 -
哈夫曼树
哈夫曼树定义为:给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。1、那么什么是权值?什么是路径长度?什么是带权路径长度呢?权值:哈夫曼树的权值是自己定义的,他的物理意义表示数据出现的次数、频率。可以用树的每个结点数据域data存放一个特定的数表示它的值。路径长度:在一棵树中,从一个结点往下原创 2013-08-21 16:58:01 · 4679 阅读 · 0 评论 -
白话经典算法系列之七 堆与堆排序
堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法。学习堆排序前,先讲解下什么是数据结构中的二叉堆。二叉堆的定义二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。当父结点的键值总转载 2013-08-21 17:37:57 · 1193 阅读 · 0 评论 -
最短路径之Dijkstra算法
Dijstra算法的基础操作是边的拓展:如果存在一条从u到v的边,那么从s到u的最短路径可以通过将边(u,v)添加到尾部来拓展一条从s到v的路径。这条路径的长度是d[u]+w(u,v)。如果这个值比目前已知的d[v]的值要小,我们可以用新值来替代当前d[v]中的值。拓展边的操作一直执行到所有的d[v]都代表从s到v最短路径的花费。这个算法经过组织因而当d[u]达到它最终的值的时候没条边(u,v)都原创 2013-08-22 21:34:57 · 1692 阅读 · 0 评论 -
最短路径之Floyd算法
(本文讲解思路清晰,分析透彻,不得不看呐!)正如我们所知道的,Floyd算法用于求最短路径。Floyd算法可以说是Warshall算法的扩展,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3)。Floyd算法的基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B。所以,我们假设Dis(AB)为节点A到节点B的最短转载 2013-08-22 22:03:49 · 1134 阅读 · 0 评论 -
拓扑排序
(好文章就是要分享!原文:http://www.cnblogs.com/shanyou/archive/2006/11/16/562861.html)拓扑排序算法: 对于一条有向边(u,v),定义u 有向图的拓扑序列的算法。一个有向图顶点的拓扑序列不是惟一的。并不是任何有向图的顶点都可以排成拓扑序列,有环图是不能排的。例子:比如排课问题,比如士兵排队问题等。转载 2013-08-22 22:40:10 · 1319 阅读 · 0 评论 -
字符串子串的查找
1. 考虑用标准函数库中 strstr() 函数包含文件:string.h函数名: strstr函数原型:extern char *strstr(char *str1, char *str2);功能:从字符串str1中查找是否有字符串str2,如果有,从str1中的str2位置起,返回str1中str2起始位置的指针,如果没有,返回null。返回值:返回该位置的指针,如找不到,原创 2013-09-29 14:33:46 · 39294 阅读 · 1 评论