
数据结构与算法
文章平均质量分 50
zengwh513
学习图像处理,音频处理,机器学习
展开
-
七大排序算法
排序各种排序算法的比较 冒泡排序基本定义两两比较相邻记录的的关键字,如果反序则交换,直到没有反序的记录为止。时间复杂度分析最好的情况是,数组是有序的,只需要n - 1次的比较,时间复杂度是O(n)O(n) 最坏的情况是,数组是逆序的,需要比较∑i=2n(i−1)=1+2+3+...+(n−1)=n(n−1)2\sum_{i=2}^{n} (i - 1) = 1+2+3+...+(n-1) = \原创 2015-08-03 22:14:18 · 1181 阅读 · 0 评论 -
动态规划(DP)之入门学习-数字三角形
数字三角形案例题目描述 Description下图给出了一个数字三角形,请编写一个程序,计算从顶至底的某处的一条路径,使该路径所经过的数字的总和最大。 (1)每一步可沿左斜线向下或右斜线向下 (2)1 < 三角形行数 < 100 (3)三角形数字为0,1,…99 输入描述 Input Description有很多个测试案例,对于每一个测试案例, 通过键盘逐行输入,第1行是输入整数(如原创 2015-05-29 10:11:34 · 24211 阅读 · 1 评论 -
【面试题】-单链表反转
问题描述将一个单链表反序输出,比如原单链表位1->2->3->4->NULL,反序输出后变为4->3->2->1->NULL解题思路原创 2015-06-15 22:29:22 · 3959 阅读 · 0 评论 -
高精度计算-大整数加减法
问题描述求两个不超过 200 位的非负整数的和。 输入数据 有两行,每行是一个不超过 200 位的非负整数,没有多余的前导 0。 输出要求 一行,即相加后的结果。结果里不能有多余的前导 0,即如果结果是 342,那么就不能 输出为 0342。输入样例 22222222222222222222 33333333333333333333 输出样例 Output Sample: 555原创 2015-05-04 10:22:06 · 3817 阅读 · 0 评论 -
排序1-冒泡,选择和插入
冒泡排序(Bubble sort)最简单,效率最低的冒泡排序冒泡排序是一种交换排序,基本思想是:两两比较相邻记录的的关键字,如果反序则交换,直到没有反序的记录为止。 代码实现void Bubble_sort(int arr[], int len){ for(int i = 0; i < len; i ++) { for(int j = i + 1; j < len原创 2015-06-27 18:33:20 · 674 阅读 · 0 评论 -
树的前序,中序,后序遍历(递归)
描述树的遍历即给出一个指向树的指针,访问树中的每一个节点。树的遍历有三种基本遍历方式,分别是前序(preorder)、中序(inorder)、后序(postorder)。原创 2015-06-12 18:16:54 · 1365 阅读 · 0 评论 -
【面试题】-求未知长度的链表的中间节点(快慢指针)
快慢指针所谓的快慢指针的快慢是指指针向前移动的步长。比如在单链表中,快指针每次向前移动2个步长,慢指针则每次向前移动1个步长。解题思路快速找出未知长度的链表的中间节点,暴力解法就是先遍历真个链表,算出链表的长度,再从头遍历长度的一半,即可找出,不过这个比较费时。更巧妙的办法是运用快慢指针,将快慢指针先指向头结点,快指针移动2个步长,慢指针移动1个步长,当快指针指向链表末尾的时候,慢指针刚好就在中间节原创 2015-06-11 16:59:55 · 3004 阅读 · 1 评论 -
散列表-开放地址法和链地址法的实现
基本定义散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系 f,使得每个关键字key对应一个存储位置f(key)。这种对应关系f称为散列或哈希函数。采用上述思想将数据存储在一块连续的存储空间中,这块连续的存储空间称为散列或哈希表。关键字对应的存储位置称为散列地址。散列技术最适合的求解问题是查找与给定值相等的记录。 如果碰到两个不同的关键字key1≠key2key_1 \neq key原创 2015-06-30 21:21:13 · 9991 阅读 · 0 评论 -
数组和链表的归并排序算法实现(C语言)
数组和链表的归并排序算法实现(C语言)原创 2015-03-05 21:11:25 · 10108 阅读 · 1 评论 -
排序2-希尔排序
希尔排序(Shell Sort)基本思想先将整个待排元素序列分割成若干子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序(增量为1)代码实现void Shell_sort(int arr[], int len){ int increment = len / 2; whi原创 2015-06-28 19:43:52 · 582 阅读 · 0 评论 -
排序4-归并排序
基本思想归并排序(Merge Sort)完全遵循上述分治法三个步骤: 1、分解:将要排序的n个元素的序列分解成两个具有n/2个元素的子序列; 2、解决:使用归并排序分别递归地排序两个子序列; 3、合并:合并两个已排序的子序列,产生原问题的解。 所以说归并排序一种分治算法的典型应用。 归并排序过程动态演示原创 2015-06-29 15:02:48 · 629 阅读 · 0 评论 -
排序3-堆排序
基本思想堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以看作是对选择排序的改进。 通常堆是通过一维数组来实现的。在起始数组为0的情形中:父节点i的左子节点在位置(2*i+1);父节点i的右子节点在位置(2*i+2);子节点i的父节点在位置floor((i-原创 2015-06-29 10:21:15 · 668 阅读 · 0 评论 -
链表排序
描述给链表的结点进行排序。比如给出 1->3->2->0->null ,排序后 0->1->2->3->null。 这里介绍链表的插入排序和归并排序。链表插入排序插入排序就是已经前面N−1N-1个结点有序的情况下,将第NN个结点分别跟前面的有序结点比较,使前NN个结点仍然有序。跟数组的插入排序有所不同的是,数组是从后面开始比较,由于链表只能从前到后,所以链表插入排序是从前面依次开始比较。最主要的思想原创 2015-08-26 22:38:20 · 1379 阅读 · 0 评论 -
二分查找实现
二分查找二分查找的前提是数组必须有序。这个算法据某本说,百分之九十的都会写错。编写程序需要注意的是非法输入尽量使用迭代,因为如果数组很大的话,递归有可能是栈溢出循环判断条件注意mid的求值方法,mid = ((right - left) >> 1) + left ;可以防止两个整型值相加时溢出。并注意>>运算符优先级低于+ - * / %,所以要对左移右移加括号。如果没有加括号,得出的答案是原创 2015-07-30 21:00:22 · 1085 阅读 · 0 评论 -
二叉树最大深度和最小深度
二叉树的最大深度给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的距离。如果二叉树为空,则深度为0 如果不为空,分别求左子树的深度和右子树的深度,去最大的再加1,因为根节点深度是1,要加进去。int maxDepth(TreeNode *root) { // write your code (here) if(root == NULL)原创 2015-08-12 06:50:45 · 13675 阅读 · 0 评论 -
翻转二叉树(递归与非递归)
翻转一棵二叉树样例 1 1 / \ / \2 3 => 3 2 / \ 4 4递归版本先翻转左子树,后翻转右子树,然后对整个树进行翻转void swapTree(TreeNode *&root){ TreeNode *tmp = root->left; root->left = root->right原创 2015-08-12 06:47:45 · 6426 阅读 · 0 评论 -
判断二叉树是否为平衡树
平衡二叉树给定一个二叉树,确定它是高度平衡的。对于这个问题,一棵高度平衡的二叉树的定义是:一棵二叉树中每个节点的两个子树的深度相差不会超过1。 先求左子树和右子树的最大深度,然后判断是否相差大于1,如果是,则不可能是,如果相差小于,继续递归调用判断左子树和右子树是否都是平衡二叉树。代码实现bool isBalanced(TreeNode *root) { // write your原创 2015-08-12 06:49:50 · 2305 阅读 · 0 评论 -
atoi代码实现
atoi函数atoi函数是实现数字字符串转整型数,实现代码的时候,要特别注意以下几点:前面有空格,调过要注意符号,即是正还是负数非法输入处理溢出代码实现int my_atoi(const char *str){ const char *s; char c; unsigned int cutoff; int acc; int neg, any, cu原创 2015-07-30 20:32:43 · 1500 阅读 · 0 评论 -
验证二叉查找树
二叉查找树给定一个二叉树,判断它是否是合法的二叉查找树(BST)一棵BST定义为:节点的左子树中的值要严格小于该节点的值。 节点的右子树中的值要严格大于该节点的值。 左右子树也必须是二叉查找树。因为二叉查找树的中序遍历是有序的。所以验证是否为二叉查找树,用中序遍历这个二叉树,如果前一个结点的值大于当前结点的值,则证明这个不是二叉树。代码实现bool isValidBST(TreeNode *ro原创 2015-08-12 06:48:55 · 2080 阅读 · 0 评论 -
排序5-快速排序
基本思想快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。 算法步骤算法步骤简述如下:选择一个基准值(pivot)(选择方法很多,可以固体选某个值,比如原创 2015-06-30 13:54:42 · 790 阅读 · 0 评论 -
【面试题】-二叉树
分别有求二叉树的节点个数,深度,和前序,中序,后序的递归和非递归实现#include <iostream>#include <stack>#include <queue>/* A B C D E F G H I J K*/using namespace std;#define OK 1原创 2015-06-23 21:06:04 · 728 阅读 · 0 评论 -
【面试题】二叉搜索树转换双向链表
题目描述输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表。而且在转换的过程中,不能创建任何新的结点,只能调整树中的结点指针的指向来实现。 二叉搜索树,左子结点的值总是小于父结点的值,右子结点的值总是大于父结点的值。解题思路如果用中序遍历二叉搜索树,遍历结点的顺序就是从小到大。所以这题的基本思路就是:用中序遍历一下二叉树,同时保留当前链表的最后一个指针pLast,以及当前指针pC原创 2015-06-24 15:57:48 · 1604 阅读 · 0 评论 -
【面试题】-判断单链表是否有环并找到环入口(快慢指针)
快慢指针所谓的快慢指针的快慢是指指针向前移动的步长。比如在单链表中,快指针每次向前移动2个步长,慢指针则每次向前移动1个步长。单链表环单链表有环的定义是链表的尾节点指向了链表中间的某个结点。比如下图。原创 2015-05-14 21:57:04 · 3830 阅读 · 0 评论 -
图的表示-邻接矩阵表示
描述图的邻接矩阵(Adjacency Matrix)表示是采用二维数组的方式。通过邻接矩阵可以立刻看出两顶点之间是否存在一条边,只需要检查邻接矩阵重行i和列j是否是非零值。对于无向图,邻接矩阵是对称的。下图是摘自《算法:C语言实现》 代码实现#include <iostream>using namespace std;const int VERTEX_NUM = 20; // 顶点的最原创 2015-04-15 14:50:33 · 6926 阅读 · 0 评论 -
图的深搜应用-Satellite Photographs
DescriptionFarmer John purchased satellite photos of W x H pixels of his farm (1 <= W <= 80, 1 <= H <= 1000) and wishes to determine the largest ‘contiguous’ (connected) pasture. Pastures are contiguou原创 2015-04-20 14:33:49 · 882 阅读 · 0 评论 -
树的遍历(非递归)
树的非递归遍历几种实现,C语言包括测试程序原创 2015-03-11 16:44:40 · 1349 阅读 · 0 评论 -
栈的C语言实现(链表和数组)
栈的C语言实现(链表和数组)原创 2015-03-10 16:09:43 · 1568 阅读 · 0 评论 -
分治算法例子集锦
分治算法例子集锦原创 2015-03-07 13:25:38 · 29395 阅读 · 3 评论 -
算法:C语言实现(第3章 学习笔记)
软件工程实践把程序分为三个部分 接口,实现和客户程序原创 2015-03-03 20:44:20 · 638 阅读 · 0 评论 -
后缀表达式的栈实现(C语言)
中缀表达式转为后缀表达式的栈实现以及计算(C语言)原创 2015-01-21 10:39:58 · 7107 阅读 · 0 评论 -
单链表的C语言简单实现
单链表的C语言简单实现原创 2015-01-14 10:43:37 · 1224 阅读 · 0 评论 -
图的邻接表表示
描述图的表示除了邻接矩阵表示,还可以使用链表数组。对每个顶点(表头节点)建立一个单链表,第i个单链表中节点表示依附于顶点vi 的边(对有向图而言,是以顶点vi为尾的弧)。所以在邻接表中,除了节点外,还有表头节点。两种方法比较假设图有V个顶点,E条边。空间权衡方面,邻接矩阵使用的空间正比于V^2;而邻接表所使用的空间正比于V+E。如果边数较少(也叫稀疏图),则优先选用邻接表。若大多数顶点对都由边相接(原创 2015-04-16 20:50:48 · 1158 阅读 · 0 评论 -
图的遍历之广度优先搜索(Breadth First Search)
描述广度优先搜索算法(Breadth First Search)与树的层序遍历(level-order traversal)类似,基本思想是思想是:从图中某顶点v出发,访问v之后,并将其访问标志置为已被访问,即visited[i]=1;依次访问v的各个未曾访问过的邻接点;分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访原创 2015-04-17 19:07:41 · 1167 阅读 · 0 评论 -
图的遍历之深度优先搜索(Depth-First Search—DFS)
描述从根节点开始的递归深度优先搜索与树的前序遍历(preorder traversal)类似,是前序遍历的推广。从某个顶点V开始处理,然后递归地遍历所有与顶点V邻接的且没有被访问过的顶点。算法的基本思想如下: 假设图G初态为所有顶点未被访问(visited[i]=false),从G中任选一顶点vi :从该顶点vi出发,首先访问vi,,置visited [vi ]=true;然后依次搜索vi的每原创 2015-04-17 13:35:36 · 2585 阅读 · 0 评论 -
动态规划(DP)之最长上升子序列
问题描述一个数的序列aia_i ,当a1<a2<...<aS a_1 < a_2 < ... < a_S的时候,我们称这个序列是上升的。对于给定的一个序列(a1,a2,...,aN)(a_1 , a_2, ..., a_N),我们可以得到一些上升的子序列(ai1,ai2,...,aik)(a_{i1} ,a_{i2}, ...,a_{ik}) ,这里1<=i1<i2<...<iK<=N1 <= i1原创 2015-05-30 08:57:16 · 2129 阅读 · 0 评论 -
【面试题】-判断两个单链表是否相交并求出相交的第一结点
问题描述判断两个单链表是否相交,如果相交,给出相交的第一个点(假设两个链表都不存在环)。相交的链表示意图如下所示。 解题思路方法一两个没有环的链表如果是相交于某一结点,如上图所示,这个结点后面都是共有的。所以如果两个链表相交,那么两个链表的尾结点的地址也是一样的。程序实现时分别遍历两个单链表,直到尾结点。判断尾结点地址是否相等即可。时间复杂度为O(L1+L2)。方法二代码实现方法一void Is_原创 2015-05-15 15:53:20 · 6026 阅读 · 0 评论 -
Simple prefix compression
描述Many databases store the data in the character fields (and especially indices) using prefix compression. This technique compresses a sequence of strings A1, …, AN by the following method: if there ar原创 2015-05-06 13:37:04 · 1301 阅读 · 0 评论 -
【面试题】-链表面试题集锦及解析
单链表反转 http://blog.youkuaiyun.com/zwhlxl/article/details/45724771求未知长度的链表的中间节点 http://blog.youkuaiyun.com/zwhlxl/article/details/45725633判断单链表是否有环并找到环入口 http://blog.youkuaiyun.com/zwhlxl/article/details/45726797判断两原创 2015-05-15 17:08:15 · 840 阅读 · 0 评论 -
高精度计算-大整数除法
问题描述求两个大的正整数相除的商 输入数据 第 1 行是测试数据的组数 n,每组测试数据占 2 行,第 1 行是被除数,第 2 行是除数。 每组测试数据之间有一个空行,每行数据不超过 100 个字符 输出要求 n 行,每组测试数据有一行输出是相应的整数商解题思路基本的思想是反复做减法,看看从被除数里最多能减去多少个除数,商就是多少。一个一个减显然太慢,如何减得更快一些呢?以 7546 除以原创 2015-05-05 10:41:13 · 4514 阅读 · 0 评论 -
高精度计算-大整数乘法
大整数乘法问题描述求两个不超过 200 位的非负整数的积。 输入数据 有两行,每行是一个不超过 200 位的非负整数,没有多余的前导 0。 输出要求 一行,即相乘后的结果。结果里不能有多余的前导 0,即如果结果是 342,那么就不能 输出为 0342。输入样例 12345678900 98765432100 输出样例 1219326311126352690000解题思路乘法规律,一原创 2015-05-04 14:43:25 · 4716 阅读 · 0 评论