随笔分类 -  算法设计与分析

1.算法设计与分析 2.排序算法 3.数据结构
【转】单链表逆序
摘要:单链表逆序http://blog.csdn.net/niuer09/article/details/5961004typedefstructtagListNode{intdata;structtagListNode*next;}ListNode,*List;要求将一带链表头List head的单向链表逆序。分析: 1). 若链表为空或只有一个元素,则直接返回;2). 设置两个前后相邻的指针p,q. 将p所指向的节点作为q指向节点的后继; 3). 重复2),直到q为空 4). 调整链表头和链表尾示例:以逆序A->B->C->D为例,图示如下实现及测试代码如下:[cpp]view 阅读全文
posted @ 2014-04-08 22:25 higirle 阅读(620) 评论(1) 推荐(0) 编辑
[原创]:排列(组合)算法的实现:
摘要:排列(组合)算法的实现: /// /// 递归算法求排列 /// /// 泛型类型 /// /// /// public static void GetPermutation(T[] array, int startIndex, int endIndex) { if (startIndex == endIndex) { StringBuilder temp = new StringBuilde... 阅读全文
posted @ 2014-02-21 14:05 higirle 阅读(499) 评论(0) 推荐(0) 编辑
算法四:回溯和分支界定
摘要:算法四:回溯和分支界定回溯:寻找问题的解的一种可靠的方法是首先列出所有候选解,然后依次检查每一个,在检查完:所有或部分候选解后,即可找到所需要的解。理论上,当候选解数量有限并且通过检查所有或部分候选解能够得到所需解时,上述方法是可行的。不过,在实际应用中,很少使用这种方法,因为候选解的数量通常都非常大(比如指数级,甚至是大数阶乘),即便采用最快的计算机也只能解决规模很小的问题。对候选解进行系统检查的方法有多种,其中回溯和分枝定界法是比较常用的两种方法。按照这两种方法对候选解进行系统检查通常会使问题的求解时间大大减少(无论对于最坏情形还是对于一般情形)。事实上,这些方法可以使我们避免对很大的候选 阅读全文
posted @ 2014-01-16 13:55 higirle 阅读(882) 评论(0) 推荐(0) 编辑
算法三:贪婪算法
摘要:贪婪算法算法思想:在贪婪算法(greedy method)中采用逐步构造最优解的方法。在每个阶段,都作出一个看上去最优的决策(在一定的标准下)。决策一旦作出,就不可再更改。作出贪婪决策的依据称为贪婪准则(greedy criterion)。拓扑排序:1. 算法描述:设n是有向图中的顶点数,设V是一个空序列w h i l e(t ru e) { 设w不存在入边( v,w),其中顶点v不在V中 如果没有这样的w,b re a k。 把w添加到V的尾部}i f(V中的顶点数少于n) //算法失败{ else V是一个拓扑序列}2. 代码示例: 阅读全文
posted @ 2014-01-10 16:33 higirle 阅读(423) 评论(0) 推荐(0) 编辑
编程之美2.5:寻找最大的K个数
摘要:编程之美2.5:寻找最大的K个数引申:寻找第k大的数:方法一:// 选择第k大的数(通过改进快速排序来实现) public static void SelectShort(int[] array, int low, int high, int k, out int value) { int i = low; int j = high; int tempItem = array[low]; value = int.MinValue; while (low t... 阅读全文
posted @ 2014-01-07 14:52 higirle 阅读(355) 评论(0) 推荐(0) 编辑
编程之美2.10:寻找数组中的最大值和最小值
摘要:编程之美2.10: 对于一个有N个整数组成的数组,需要比较多少次才能把最大值和最小值找出来呢?算法的思想是:分而治之测试数据:----------------------------------------------------int []input1= { 94, 40, 49, 65, 21, 21, 106, 80, 92, 81, 679, 4, 61, 6, 237, 12, 72, 74, 29, 95, 265, 35, 47, 1, 61, 397, 52, 72, 37, 51, 1, 81, 45, 435, 7, 36, 57, 86, 81, 72 };最大数据:67 阅读全文
posted @ 2014-01-06 15:46 higirle 阅读(748) 评论(0) 推荐(0) 编辑
算法二:分而治之
摘要:分而治之方法与软件设计的模块化方法非常相似。为了解决一个大的问题,可以:1) 把它分成两个或多个更小的问题;2) 分别解决每个小问题; 3) 把各小问题的解答组合起来,即可得到原问题的解答。小问题通常与原问题相似,可以递归地使用分而治之策略来解决1.[金块问题] 有一个老板有一袋金块。每个月将有两名雇员会因其优异的表现分别被奖励一个金块。按规矩,排名第一的雇员将得到袋中最重的金块,排名第二的雇员将得到袋中最轻的金块。根据这种方式,除非有新的金块加入袋中,否则第一名雇员所得到的金块总是比第二名雇员所得到的金块重。如果有新的金块周期性的加入袋中,则每个月都必须找出最轻和最重的金块。假设有一台比较重 阅读全文
posted @ 2014-01-02 15:58 higirle 阅读(690) 评论(0) 推荐(0) 编辑
数据结构之二叉树
摘要:二叉树的实现:public class Node { T date; public T Date { get { return date; } set { date = value; } } Node lChild; public Node LChild { get { return lChild; } set { lChild = value; } } Node rChild... 阅读全文
posted @ 2013-12-26 10:29 higirle 阅读(379) 评论(0) 推荐(0) 编辑
动态规划之01背包问题和三角形问题
摘要:01背包问题有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。状态:用f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值,其状态转移方程为f[i][v]=max{ f[i-1][v], f[i-1][v-c[i]]+w[i] }。复杂度分析:状态数:O(NV), 迁移:O(1)总复杂度:O(NV)状态f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。对于“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策 阅读全文
posted @ 2013-12-24 13:32 higirle 阅读(555) 评论(0) 推荐(0) 编辑
算法一:动态规划
摘要:动态规划一.动态规划含义:在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都要做出决策,从而使整个过程达到最好的活动效果.因此,各个阶段决策确定后,组成一个决策序列,因而也就确定了整个过程的一条活动路线.这种把一个问题看作是一个前后关联具有链状结构的多阶段过程,就称为多阶段决策过程,这种问题称为多阶段决策问题. 在多阶段决策问题中,各个阶段采取的决策,一般来说是和时间有关的,决策依赖于当前状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来的,故有"动态"的含义,我们称这种解决多阶段决策最优化的过程为动态规划.二 阅读全文
posted @ 2013-12-20 13:22 higirle 阅读(678) 评论(0) 推荐(0) 编辑
编程之美2.16 求数组中最长递增子序列
摘要:编程之美2.16 最长递增子序列:写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中的最长递增子序列的长度。例如:在序列1,-1,2,-3,4,-5,6-7中,其最长的递增子序列为1,2,4,6分析:利用动态规划分析。用A[i]来更新maxLen和MaxV:,从A[0]~A[i-1]可能存在多个存在多个子问题的最优解,所以需要将他他们合并为一个。1. 当A[i]>MaxV[maxLen](即子问题最优解的最小值)时,maxLen++ && MaxV[maxLen] = a[i] A[i]>MaxV[maxLen]时,A[i]必然比MaxV[0]-MaxV[ 阅读全文
posted @ 2013-12-19 16:49 higirle 阅读(394) 评论(0) 推荐(0) 编辑
编程之美:常见面试题思想方法整理
摘要:对于很多精妙的题目,常常在想这些出题的童鞋是怎么想到的,因为这些题目确实能够很深入的考察出一个面试者的逻辑,算法和思维功底。本文章主要是总结自己在做这些面试题和了解相应解法的过程中思考的一些东西,感觉这些东西在很多题目中都出现过,非常值得抽象出来专门理解。 一 双指针遍历 所谓双指针,是利用两个指针对一个有序数组进行遍历,查找出符合要求的数据集合。相信大家都接触到了这种思维模式的解题方法,只是没有注意到罢了。下面举几个例子吧。 例1:给定一个数组a[n],求数组中是否存在两个数的和等于给定值sum并输出?编程之美 2.12 快速寻找满足条件的两个数 这个问题很常见,我当年在面试微软实习... 阅读全文
posted @ 2013-12-19 12:55 higirle 阅读(3446) 评论(0) 推荐(1) 编辑
编程之美:2.14 求数组的子数组之和的最大值和最小值(动态规划)
摘要:问题一:一个有N个整数元素的一维数组(A[0],A[1]....,A[n-2],A[n-1]),求子数组之和的最大值是什么?方法一:动态规划问题描述符合动态规划最优子结构的要求。设b[i]表示以a[i]结尾 的子数组的最大子段和(a[i]一定包含在b[i]中,即:b[i]=max{sum(a[j~i])},其中0Max{sum, Max{a[i], b[i-1]+a[i]}}1. 包含a[i],即求b[i]的最大值,在计算b[i]时,可以考虑以下两种情况,因为a[i]要求一定包含在内,所以 1) 当b[i-1]>0,b[i] = b[i-1]+a[i] 2) 当b[i-1]sum ,即b 阅读全文
posted @ 2013-12-19 12:43 higirle 阅读(1077) 评论(0) 推荐(0) 编辑
编程之美:2.21只考加法的面试题
摘要:《编程之美》 2.21只考加法的面试题我们知道:1+2 = 3;4+5 = 9;2+3+4 = 9。等式的左边都是两个或两个以上连续的自然数相加,是不是所有的整数都可以写成这样的形式呢?问题1: 对于一个64位正整数,输出它所有可能的连续自然数(两个以上)之和的算式。问题2: 大家在测试上面程序的过程中,肯定会注意到有一些数字不能表达为一系列连续的自然数之和,例如32好像就找不到。那么,这样的数字有什么规律呢?能否证明你的结论?问题3: 在64位正整数范围内,子序列数目最多的数是哪一个?问题一解法:双指针遍历这题有两种解法, 其中一种便是双指针法,还有一种比较巧妙,利用了数学方法,简单来说是求 阅读全文
posted @ 2013-12-18 10:13 higirle 阅读(626) 评论(0) 推荐(1) 编辑
编程之美的2.17,数组循环移位 & 字符串逆转(反转) Hello world Welcome => Welcome world Hello
摘要:代码如下:(类似于编程之美的2.17,数组循环移位) static void Main(string[] args) { string input = "Hello World Welcome"; char[] tempArray = input.ToCharArray(); string result = RightShift(tempArray, 0, tempArray.Length-1); } public static string Rig... 阅读全文
posted @ 2013-12-17 12:28 higirle 阅读(673) 评论(0) 推荐(0) 编辑
编程之美:求字符串距离
摘要:public static int CalculateStringDistance(string strA, int pABegin, int pAEnd, string strB, int pBBegin, int pBEnd) { if (pABegin > pAEnd) { if (pBBegin > pBEnd) { return 0; } else ... 阅读全文
posted @ 2013-12-12 16:54 higirle 阅读(292) 评论(0) 推荐(0) 编辑
堆排序算法的实现 (冒泡排序)
摘要:方法一:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication3{ class Program { static void Main(string[] args) { List seqlist = new List { 42, 20,17, 27,13,8,17,48}; HeadOrder... 阅读全文
posted @ 2013-12-11 13:54 higirle 阅读(430) 评论(0) 推荐(0) 编辑
动态规划:伐木问题
摘要:伐木问题一片环形的林带按照时钟方向分成N块相邻的林地,首尾相连,每一块林地均与另两块林地相邻。伐木工对每一块林地里可采伐的木材量进行了估计,这些木材量以 int[] woods 来表示。这个数组按顺时针顺序列出了每一块林地里的可采伐木材量。现在要在这片林带中选择一些林地来进行采伐。但为了不破坏生态,不能有两块相邻的林地同时被采伐。你必须编写程序来计算最大可采伐的木材量。函数声明:int maxWoods(int[] woods)参数范围:woods可以包含2到50个元素。每一个元素的取值范围为1到1000。测试用例:1:{10, 3, 2, 5, 7, 8}输出:19注:因为林地首尾相连,所以 阅读全文
posted @ 2013-06-06 10:49 higirle 阅读(548) 评论(0) 推荐(0) 编辑
算法系列文章
摘要:算法大全:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=alg_index 阅读全文
posted @ 2012-12-05 17:55 higirle 阅读(184) 评论(0) 推荐(0) 编辑