算法学习笔记
文章平均质量分 66
Justlinux2010
新浪微博 justlinux2010
展开
-
算法学习笔记----插入排序
一、算法描述 插入排序是一种比较直观的排序算法,其思想是:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,直到找到一个合适和位置并插入。具体算法描述如下(升序排列): 1. 从第一个元素开始,该元素可以认为已经是排好序的了 2.取出下一个元素,在已经排序的元素序列中从后向前扫描 3.如果该元素(已排序)大于新元素,将该元素移到下一个位置原创 2013-01-26 18:27:57 · 1152 阅读 · 0 评论 -
找到11的n次方十进制表示中1的个数
这个题目是群里贴出来的的,只有图片,题目如下:解题思路:很明显,这个题目如果直接计算11的n次方的值的话肯定不行,因为n的取值范围是0到1000,在C语言中即使用unsigned long也存储不了这么大的结果。要解决这个问题,还是要从11这个数本身的特点入手。我最开始的想法是展开(10+1)^n,然后从这个展开的式子中找到解题方法,但是展开的结果表示这个路子走不通原创 2013-05-15 18:15:14 · 4499 阅读 · 0 评论 -
算法学习笔记----最长公共子序列问题
(说明:由于CSDN的博客中不能添加下标等特殊符号,所以部分内容使用截图的形式)static void print_lcs(int **b, char *x, int i, int j){ int key; if (i == 0 || j == 0) { return; } key = b[i-1][j-1]; switch原创 2013-04-21 16:38:50 · 1144 阅读 · 0 评论 -
算法学习笔记----用动态规划解决钢管切割问题
(说明:由于CSDN的博客中不能添加下标等特殊符号,所以部分内容使用截图的形式)通过对问题进行高度抽象,现在我们的问题,就是要递归地求解rn 的最大值,下面采用的是一种自顶向下的递归方法:int p[] = {1, 5, 8, 9, 10, 17, 17, 20, 24, 30};static inline int max(i, j){原创 2013-04-21 16:21:06 · 3747 阅读 · 0 评论 -
算法学习笔记----二叉搜索树
一、算法描述顾名思义,一颗二叉搜索树是以一颗二叉树来组织数据的。这样一棵树可以使用一个链表数据结构来表示,每一个节点都是一个对象。除了key和卫星数据之外,每个节点还包含属性left、right和p,它们分别指向节点的左孩子、右孩子和双亲。二叉搜索树不是一颗普通的二叉树,是具有下列性质的二叉树:1. 若它的左子树不空,则左子树上所有节点都不大于它的根节点的值2. 若它的右子树不空,则右原创 2013-03-10 16:27:40 · 1507 阅读 · 1 评论 -
算法学习笔记----快速排序
一、算法描述 快速排序是一种最坏情况时间复杂度为Θ(n^2)的排序算法。虽然最坏情况时间复杂度很差,但是快速排序通常是实际排序应用中最好的选择,因为它的平均性能非常好:它的期望时间复杂度为Θ(nlgn),而且Θ(nlgn)中隐含的常数因子非常小。另外,它还能原址排序,甚至在虚存环境中也能很好地工作。算法步骤如下所示:1、将源数组A[p..r]划分为两两个子数组A[p..q-1]和A[原创 2013-02-24 16:28:27 · 1476 阅读 · 0 评论 -
算法学习笔记----归并排序
一、算法描述 归并排序算法完全遵循分治模式,将问题分解为若干子问题,如果子问题的规模足够小,则直接求解,否则递归地求解各子问题。算法步骤如下所示: 1)将待排序的n个元素的序列分解为各具n/2个序列的两个字序列 2)使用归并排序递归地将两个子序列排序 3)将两个已排序的子序列合并,生成排好序的序列。二、算法实现 1、递归版本 为了避免在合并两个子原创 2013-01-27 14:46:03 · 1268 阅读 · 0 评论 -
算法学习笔记----堆排序
堆是一个数组,可以看成一个近似的完全二叉树,除了最底层外,其余各层都是充满的,而且是从左到右填充。假设数组A[1..A.hep_size]是一个对,给定一个结点的下标i,很容计算出其父节点、左孩子和右孩子的下标,如下所示(这里的数组下标是从1开始): 在C语言中数组下标是从0开始的,因此在计算父节点、左右子节点时的公式和上图中有所不同,如下图所示: 二叉堆可以分为两种形原创 2013-02-03 20:26:15 · 3259 阅读 · 1 评论 -
算法学习笔记----用主方法求解递归式
以下内容来自《算法导论》,做个记录,便于查阅。 主方法为如下形式的递归式提供了一种“菜谱”式的求解方法,如下所示其中a≥1和b>1是常数,f(n)是渐近正函数。为了使用主方法,需要牢记三种情况,但随后你就可以很容易地求解很多递归式,通常不需要纸和笔的版主。 主方法依赖于下面的定理。 定理4.1(主定理) 令a≥1和b>1是常数,f(n)是一个函数,T(n)是定义原创 2013-02-03 10:58:29 · 8912 阅读 · 0 评论 -
算法学习笔记----最大子数组问题
题目:给定义数组A,长度为n,找出数组A中的最大子数组,例如数组A={-23,18,20,-7,12},则最大子数组为{18,20,-7,12}。解题思路: ①很容易想到的方案是简单地尝试每对可能的组合,然后从这些组合中找出最大的子数组。从数组中选择一个数A(i),然后计算以A(i)开始的所有子数组的和,计算的次数为(n-i),选择的次数为n,因此该算法的时间复杂度为Θ(n^2),该算法原创 2013-02-02 17:33:24 · 1445 阅读 · 0 评论 -
算法学习笔记----判断集合S中是否存在有两个其和等于x的元素
题目:请给出一个运行时间为Θ(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个整数x时,判断出S中是否存在有两个其和等于x的元素。解题思路:直观的方法是直接计算集合中两两元素的和,然后判断是否存在x,但时间复杂度为Θ(n^2),不符合题目的要求,也不是一个好的解决问题的方法,下面两种方法要好一些: 第一种是《算法导论》的教师手册上提供的思路,构建一个辅助集合S',通过查原创 2013-01-29 10:32:47 · 2711 阅读 · 0 评论 -
算法学习笔记----确定n个元素的任何排列中逆序对的数目
题目:设A[1...n]是一个包含n个不同数的数组。如果在iA[j],则(i,j)就称为A中的一个逆序对(inversion)。给出一个算法,它能用Θ(nlgn)的最坏情况运行时间,确定n个元素的任何排列中逆序对的数目。解题思路: ①比较直观的方法是循环从数组中取出一个元素k,然后从k之后的元素中找到比k小的元素个数,最后统计所有的个数即为排列中逆序对的数目。从数组中取元素的次数为n,每次原创 2013-01-29 18:11:10 · 2331 阅读 · 1 评论 -
算法学习笔记----递归式证明
题目:利用数学归纳法证明:当n是2的整数次幂时,递归式的解为T(n)=nlgn。 证明如下: 当n=2时,T(n)=2*lg2=2。 假设递归式的解为T(n)=nlgn,有T(n/2)=(n/2)lg(n/2),将T(n/2)带入递归式,过程如下所示:T(n) = 2*(n/2)*lg(n/2) + n = nlg(n/2) + n = n原创 2013-01-28 12:08:26 · 1972 阅读 · 1 评论 -
Find the first covering prefix of array
这是在codility上看到的一个题目:A non-empty zero-indexed array A consisting of N integers is given. The first covering prefix of array A is the smallest integer P such that 0≤PFor example, the first cov原创 2013-05-13 17:36:30 · 2298 阅读 · 0 评论