- 博客(15)
- 收藏
- 关注
原创 数组
数组名的值是一个指针常量。下标引用 int array[10];int *ap=array+2;ap[0]//除了优先级职位,下标引用和间接访问完全相同。ap[0]等价于*(ap+(0))。ap[6]//等价于 *(ap+6)ap[-1]//等价于 *(ap-1),也就是array[1]指针与下标。指针比下标更有效率,//每一次循环都要做乘法运算:array+a*sizeof(int
2016-01-28 12:39:34 258
原创 图的基础算法-广度优先搜索/深度优先搜索
图有矩阵存储和链表存储两种。这里采用链表存储。 参考《算法导论》上面的做法,首先定义图结点的结构。为了跟踪算法的进展,广度优先搜索在概念上将每个结点涂成白色。在算法推进过程中,结点的颜色可能变成灰色或者黑色。在搜索过程中,第一次遇到一个结点时,表示该结点已被发现,此时该结点的颜色将从白色变成灰色。灰色或黑色结点都是已经被发现过的结点。所有与黑色结点邻接的结点都已经被发现。对于灰色结点来说,其邻接结
2016-01-22 17:25:05 382
原创 贪心算法-哈夫曼编码
《算法导论》引理16.2:令C为一个字母表,其中每个字符c属于C都有一个频率c.freq。令x和y是C中频率最低的两个字符,那么存在C的一个最优前缀码,x和y的码字长度相同,且只有最后一个二进制位不同。(证明问题具有贪心选择性质) 引理16.3 令C为一个给定的字符表,其中每个字符c属于C都定义了一个频率c.freq。令x和y是C中频率最低的两个字符。令C1为C去掉字符x和y,加入一个新字
2016-01-20 10:07:40 1359
原创 动态规划-最长公共子序列
若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。 给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和
2016-01-17 20:29:31 297
原创 动态规划-矩阵链乘法
矩阵链乘法问题:给定n个矩阵的链<A1,A2...An>,矩阵Ai的规模为p[i-1]*p[i],求完全括号化方案,使得计算乘积A1A2…An所需标量乘法次数最少。 m[i][j]表示矩阵链Ai…j所需标量乘法次数的最小值。 当m[i][j]只包含唯一的矩阵Ai,即i=j,m[i][i]=0;m[i][j]=m[i][k]+m[k+1][j]+p[i-1]p[k]p[j](i<=k<j,i<j)
2016-01-17 20:17:49 281
原创 红黑树
笔者在之前学习数据结构的时候,看到红黑树觉得好难就跳过了。最近在看《算法导论》里面也讲到了红黑树,于是笔者决定好好学习红黑树的知识。然而在看书上的讲解,感觉完全看不懂,很难吸收里面的知识。 对于左旋转和右旋转,虽然能看懂代码,但是完全不明白为什么要会这样的操作。对于红黑树的插入和删除时破坏红黑树性质时为什么要这样变颜色那样变颜色,也是不知所云。 后来在网上搜资料,看见有人说红黑树是对2-3查找树
2016-01-15 10:16:26 234
原创 二叉搜索树
二叉搜索树支持多种动态集合操作。treeSearch、treeMin、treeMax、successorTree(后继)、predecessorTree(前驱)、insert、delete 一棵二叉查找树是按二叉树结构来组织的。用链表来表示二叉查找树。结点的结构如下。 二叉搜索树的关键字的性质:设x为二叉搜索树的一个结点。如果y是x左子树中的一个结点,则y.val<=x.val;如果y是x右子树
2016-01-14 09:50:43 249
原创 快速排序
快速排序使用了分治思想。 对典型的子数组A[p..r]进行快速排序的三步分治过程: 分解: 数组A[p..r]被划分为两个(可能为空)子数组A[p..q-1]和A[q+1..r],使得子数组A[p..q-1]的所有元素都不大于A[q],数组A[q+1,r]的元素都大于A[q]中的每个元素。这里需要计算下标q。 解决: 通过递归进行快速排序,对子数组A[p..q-1]和A[q+1,r]都进行快速
2016-01-08 11:43:51 199
原创 堆排序
在最大堆中,最大堆性质是指除了根以外的所有结点i都满足: A[PARENT(i)]>=A[i] 在最小堆中,最小堆性质是指除了根以外的所有结点i都满足: A[PARENT(i)]<=A[i]维护堆的性质 void maxheap(vector<int> &heap,int i,int heapsize) 该函数用于维护最大堆性质的重要过程。这里假定根结点为LEFT(i)和RIGHT(i)的
2016-01-07 21:01:32 187
原创 归并排序
mergeSort(A,p,q,r),其中A是一个数组,p,q,r是数组的下标,满足p<=q<=r。该过程假设A[p..q]和A[q+1..r]是已排好序,该函数合并这两个子数组形成单一的已排好序的子数组并代替当前的子数组A[p..r]。 该归并过程可以用扑克牌游戏描述。桌上有两堆牌,每堆都已排序,最小的牌在顶上。我们希望将两堆牌合并成单一的排好序的输出堆。基本步骤包括在牌面朝上的两堆牌的顶上两张
2016-01-06 20:22:20 204
原创 插入排序
插入排序,对于少量元素的排序,是一个有效的算法。 插入排序类似于排序一手扑克牌。左手是现有的已排序的扑克牌,桌上有牌堆,我们每次从牌堆上那一张牌并将它插入到左手正确的位置。void insertSort(vector<int> &nums){ for(int i=1;i<nums.size();i++){ int key=nums[i]; int j=i-1
2016-01-06 19:54:13 249
原创 字符串左旋转--编程珠玑
问题描述:待移动的数组假设为str,长度为len,需要左旋转rotate位 方法一:最简单方法。将数组的前rotate元素复制到一个临时数组中,然后将余下的len-rotate个元素向左移动i个位置,最后将最初的rotate个元素从临时数组中复制到a中余下的位置。这样的做法产生了过大的存储空间的消耗。 方法二:杂技算法。移动str[0]到临时变量tmp,然后移动str[rotate]至str[0
2016-01-05 20:21:56 482
原创 Multiply String-Leetcode
Given two numbers represented as strings, return multiplication of the numbers as a string. Note: The numbers can be arbitrarily large and are non-negative.这道题思路很简单,根据乘法的算法,嵌套循环。class Solution {pu
2016-01-04 19:58:28 331
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人