
算法导论
十觞亦不醉
编程浪子
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
InsertionSort -- 插入排序(C++)
template void insertionSort(vector &arr) { for(int j = 1; j < arr.size(); ++j) { T key = arr[j]; int i = j - 1; while(i >= 0 && arr[i] > key) { arr原创 2015-11-04 15:07:49 · 517 阅读 · 0 评论 -
最长公共子串 Longest-Common-Substring(LCS)
给定两个字符串X,Y,求二者最长的公共连续子串,如 X = [abcdefg],Y = [bacdegf],二者的最长公共连续子串是 cde 长度为3, 这里讨论 DP 方案。 考虑 m = X.length,n = Y.length 开辟一个大小为 m x n 的数组 d[m][n],使用 d[i][j] 表示以 X[i] 与 Y[j] 结尾的最长公共子串的长度,因为要求子串连续,所原创 2016-03-06 13:49:34 · 798 阅读 · 0 评论 -
二叉搜索树的查询、插入与删除操作(Binary Search Tree, Search, Insert, Delete)(C++)
一、概念 设 x 是二叉搜索树中的一个结点。如果 y 是 x 左子树中的一个结点,那么 y.key ≦ x.key。如果 y 是 x 右子树中的一个结点,那么 y.key ≧ x.key。 为了便于描述,我们按如下方式定义树结点: struct TreeNode { int key; TreeNode* left; TreeNode* right;原创 2015-11-19 16:09:41 · 3136 阅读 · 0 评论 -
CountingSort -- 计数排序(C++)
计数排序假设 n 个输入元素中的每一个都是在 0 到 k 区间内的一个整数,其中 k 为某个整数,当 k = O(n)时,排序的运行时间为Θ(n)。代码如下: void countingSort(vector &arr, int k) { vector c(k + 1, 0); vector tmpArr(arr); for (auto x : tmpArr) ++c[x]; f原创 2015-11-10 15:14:51 · 527 阅读 · 0 评论 -
寻找数组中第i小的数(C++)
这是一个典型的选择问题,这里我们采用分治算法 RandomizedSelect,其渐近运行时间为Θ(n)。这里我们与快排类似,对数组进行递归划分,但与快速排序不同的是,快速排序会递归处理划分的两边,而 RandomizedSelect 只处理划分的一边。 template int partitionArray(T arr[], int low, int high) { T pivot =原创 2015-11-10 23:53:53 · 1869 阅读 · 0 评论 -
QuickSort -- 快速排序(C++)
方案一 每次采用最后一个元素作为 pivot,代码如下: template int partitionArray(T arr[], int low, int high) { T pivot = arr[high]; int i = low - 1; for(int j = low; j < high; ++j) if(arr[j] <= piv原创 2015-11-09 14:51:44 · 1055 阅读 · 0 评论 -
HeapSort -- 堆排序
struct HEAP { vector arr; int sizeHeap; explicit HEAP(const vector &src) { sizeHeap = src.size(); arr = src; buildMaxHeap(); } // Get the left child i原创 2015-11-08 18:51:09 · 350 阅读 · 0 评论 -
用主方法求解递归式
原创 2015-11-07 14:54:45 · 4782 阅读 · 0 评论 -
Maximum subarray -- 最大子数组问题(C++)
题目 输入一个整形数组,数组中有正数有负数,数组中一个或连续的多个整数组成一个子数组,求所有子数组和的最大值。 分析 此处我们考虑用分治法来解决。假定我们要寻找数组A[low...high]的最大子数组,使用分治意味着我们要将数组划分为两个规模尽量相等的子数组,也就是说,找到数组的中央位置,设为mid,然后考虑求解两个子数组A[low...mid]和A[mid + 1原创 2015-11-05 23:22:54 · 1137 阅读 · 0 评论 -
MergeSort -- 归并排序(C++)
template void mergeArray(vector &arr, int first, int mid, int last) { vector arr_tmp(arr); int i = first, j = mid + 1, k = first; while(i <= mid && j <= last) { if(arr_tmp[i]原创 2015-11-04 19:25:41 · 1086 阅读 · 0 评论 -
SelectionSort -- 选择排序(C++)
template void selectionSort(vector &arr) { for(int i = 0; i < arr.size() - 1; ++i) { auto min_iter = min_element(arr.begin() + i, arr.end()); swap(*min_iter, *(arr.begin() + i)原创 2015-11-04 15:43:09 · 448 阅读 · 0 评论 -
最长公共子序列,Longest-Common-Subsequence(LCS)
公共子序列有别于公共子串,子序列可以不连续,如 X = [abcbdab], Y = [bdcaba],则 bcba 为其一个公共最长子序列。同样考虑DP方案,假设 X = , Y = ,LCS(X, Y) 表示二者的公共最长子序列,则有 如果 xm == yn,则 LCS(X, Y) = xm + LCS(Xm-1, Yn-1);如果 xm != yn,则 LCS(X, Y) = max原创 2016-03-06 14:26:10 · 462 阅读 · 0 评论