随笔分类 - 数据结构与算法
摘要:二叉查找树:对于树中的每个节点X,它的左子树所有关键字小于X的关键字,而右子树的所有关键字大于X的关键字。二叉查找树的平均深度是O(logN)。二叉查找树的删除操作:如果节点是一片树叶,可以立即删除。如果有一个儿子,调节父节点指针绕过该节点后被删除。如果有两个儿子,用右子树的最小数据代替该节点的数据...
阅读全文
摘要:描述有一个长为n的数列a0,a1,…,an-1。求出这个序列中最长的上升子序列长度。上升子序列指的是对于任意的i < j,都满足ai < aj的子序列。输入n = 5a = {4,2,3,1,5}输出3(a1,a2,a4构成的子序列2,3,5最长)这个问题是被称作最长上升子序列的著名问题。这一问题通...
阅读全文
摘要:有n种重量和价值分别为wi,vi的物品。从这些物品中挑选总重量不超过W的物品,求出挑选物品价值总和的最大值。每种物品可以挑选任意多件。令dp[i+1][j]:=从前i种物品中挑选总重量不超过j时总价值的最大值。那么递推关系为:根据递推关系编写代码: 1 void solve() 2 { 3 ...
阅读全文
摘要:各有n个整数的四个数列A、B、C、D。要从每个数列中各取一个数,使四个数的和为0。求出这样组合的个数。输入n = 6A = { -45, -41, -36, -36, 26, -32 }B = { 22, -27, 53, 30, -38, -54 }C = { 42, 56, -37, -75, ...
阅读全文
摘要:n个物品的重量和价值分别是wi和vi。从中选取k个物品使单位重量的价值最大输入n = 3k = 2(w, v) = { (2, 2), (5, 3), (2, 1) }输出0.75(选择0和2号物品,平均价值是(2+1)/(2+2) = 0.75)一般最先想到的方法可能是把物品按照单位价值排序,从大...
阅读全文
摘要:给定大小为N*M的迷宫,求出起点到终点的最小步数。输入输出22 1 #include 2 #include 3 #include 4 using namespace std; 5 6 #define MAX_N 100 7 #define MAX_M 100 8 9 const int I...
阅读全文
摘要:希尔排序(Shellsort)的名称源于它的发明者Donald Shell,该算法是冲破二次时间屏障的第一批算法之一。不过,自从它最初被发现,又过了若干年才证明了它的亚二次时间界。它通过比较相距一定间隔的元素来工作;各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。希尔排...
阅读全文
摘要:对于数组A[N]的插入排序由N-1趟排序组成。对于P=1趟到P=N-1趟,插入排序保证从位置0到位置P上的元素已为排序状态。实际上插入排序利用了这样的事实:位置0到位置P-1上的元素是已排过序的。在第P趟,我们将位置P上的元素向左移动到它在前P+1个元素的正确位置上。插入排序的过程可以用下图表示。具...
阅读全文
摘要:深度优先搜索(DFS, Depth-First Search)是搜索的手段之一。它从某个状态开始,不断地转移状态直到无法转移,然后退到前一步的状态,如此不断重复,直至找到最终的解。部分和问题给定整数a1、a2、……、an,判断是否可以从中选出若干个数,使它们的和恰好为k。限制条件1 ≤ n ≤ 20...
阅读全文
摘要:素数筛选法原理就是当i是素数的时候,i的所有的倍数必然是合数。如果i已经被判断不是质数了,那么再找到i后面的质数来把这个质数的倍数筛掉。算法实现 1 #include 2 #include 3 using namespace std; 4 5 int main() 6 { 7 int ...
阅读全文
摘要:1 #ifndef _Tree_H 2 3 struct TreeNode; 4 typedef struct TreeNode *Position; 5 typedef struct TreeNode *SearchTree; 6 7 SearchTree MakeEmpty(...
阅读全文
浙公网安备 33010602011771号