随笔分类 - 算法&&数据结构
摘要:问题定义:有2n+1个数,只有一个单着,别的都是成对的,找出这个单着的数。比如:2 1 3 2 1。3是答案。思路一:暴力搜索——每个数都和其他数比较,找不到相同的,就得到了结果。时间复杂度为o(n2)思路二:排序搜索——先给序列排个序,之后从前往后一对一对的找,直到不是成对的为止。时间复杂度,怎么也得o(nlgn)思路三:异或计算,一趟搞定。时间复杂度o(n)直接看思路三:原理:异或操作(^)——(对于位操作)相同为0,相异为1.比如:1^0 = 1, 1 ^1=0这样:两个相同的数异或就为0任何数和0异或为自己(转化到位。1^0 = 1,0 ^0=0)例如:5 ^ 5 = 0 5 ^0 =
阅读全文
摘要:本文从三个层次分析最大公共子序列最大公共子序列长度最大公共子序列算法分析首先来个区别:单词"cnblogs"子序列:从单词中抽取字符,不能保证连续抽取。如”cn"、“cns"、”bgs"连续子序列:从单词中连续抽取字符。如“bolog"、”cnbl"最长公共子序列(LCS:Longest Common Subsequence)顾名思义,就是几个词语中最长的相同子序列。比如“cnblogs"和”belong"最大公共子序列是“blog" 最长公共子序列是个非常有用的算法,可以判断两段文字间的”雷同
阅读全文
摘要:选择问题——在序列中按顺序找到某个元素。这可以用排序方法做到,即先排个序,在找到指定元素,但是这样就按最快的堆排序、合并排序啥的都得是O(nlgn)数量级的,这里采取的方法可以在期望为O(n)的时间内完成。具体的做法如同快速排序,因为快速排序最好情况时间也为O(nlogn),但是在实际情况下,遇到的代拍序列并不是最好的。因此,一种改进的方式是快速排序的随机化版本。利用随机化方式应用到该选择问题中,可以是程序期望在在线性时间内完成。具体的实现方式如下:int Select(int *A, int begin, int end, int i){ if(begin == end)...
阅读全文
摘要:可以采用以下方法在o(n)时间内选出最大值。图示: 代码:int Max(int *A, int arraysize){ int max = A[0], i; for(i=0; i<arraysize; i++) { if(max < A[i]) { max = A[i]; } } return max;}//总共比较 n-1次现在有两个问题: 1)如何同时找到最大值和最小值 2)如何找到最大的两个值解决方案:问题1) 方案...
阅读全文
摘要:为说明思想,假设队列、栈都很大,不会出现满的情况。1. 两个栈实现队列//前提已知:struct Stack{ int top; //栈顶指针 int stacksize;//栈的大小 int *s; //栈底指针};void InitStack(Stack *s...
阅读全文
摘要:队列特性:先进先出(FIFO)——先进队列的元素先出队列。来源于我们生活中的队列(先排队的先办完事)。 队列有下面几个操作: InitQueue() ——初始化队列 EnQueue() ——进队列 DeQueue() ——出队列 IsQueueEmpty()——判断队列是否为空 IsQueueFul
阅读全文
摘要:图示 插入排序的基本思想是:对于数组前边部分已经是排好序的了,对于接下来的元素查找其在前面的位置,插入之。如下图中1 2 4 7 已经排好序,接下来找到2的位置,插入到1和3之间。之后同样处理4和9.参考代码void insertSort(int A[], int lens){ if (A...
阅读全文
摘要:基本思想假设数序列中小于元素a的个数为n,则直接把a放到第n+1个位置上。当存在几个相同的元素时要做适当的调整,因为不能把所有的元素放到同一个位置上。计数排序假设输入的元素都是0到k之间的整数。参考代码#include void COUNTINGSORT(int *A, int *B, int ar...
阅读全文
摘要:思路像合并排序一样,快速排序是基于分支模式的:分解:数组A[n]被划分两个字数组A[0..q-1]和A[q+1..n],使得对于数组A[0..q-1]中的元素都小于A[q], A[q+1..n]中的元素都大于等于A[q]。此时A[q]就得排好序。解决:通过递归调用快速排序,对字数组A[0..q-1]...
阅读全文
摘要:一 初识堆堆 数据结构是一种数组,它可以视为一颗完全二叉树。如下图: 图中的树是数组,A={16, 14, 10, 8, 7, 9, 3, 7},圈内表示数值,圈外红色的数字表示数组的下标。array_size是数组的大小(此时是8),heap_size是构建堆的元素的多少。满足heap_size...
阅读全文
摘要:递归算法是把一个问题分解成和自身相似的子问题,然后再调用自身把相应的子问题解决掉。这些算法用到了分治思想。其基本模式如下: 分解:把一个问题分解成与原问题相似的子问题 解决:递归的解各个子问题 合并:合并子问题的结果得到了原问题的解。 现在就用递归算法,采用上面的分治思想来解合并排序。 合并排序(非
阅读全文
摘要:作为一个计算机工程人员,编程最基础的工作,犹如厨师会做饭、建筑工人会垒砖。但算法重在思想,没有精美的菜谱不会有美味的菜肴、没有设计师的图纸盖不起绝世的建筑。 时间是宝贵的,但又是冗余的。往事越千年,弹指一挥间,从人类历史长河的角度来审视我们的人生,短短几十年,何其宝贵。但是再看看现实中的我们,有多少人在毫无价值的事情浪费了多少精力。时间是宝贵的,人生只能活一回。为了更好地生活、为了爱我的人和我爱的人、为了不虚度此生,好好珍惜时光,干点正事。
阅读全文