算法设计
艾伦lee
系借此向大家交流学习
展开
-
五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法
分治算法一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题转载 2017-12-29 15:56:42 · 530 阅读 · 0 评论 -
堆栈实现中缀表达式转为后缀表达式
堆栈实现中缀表达式转为后缀表达式(1)规则 中缀表达式转为后缀表达式也有一定的规则,这个规则是根据操作符的运算优先级来定的转为后缀表达式的规则为:如果遇到操作数,我们就直接将其输出。 如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中。 如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止。注意,左括号只弹出并不输出。 如果遇到任...原创 2019-01-29 16:06:54 · 5408 阅读 · 0 评论 -
使用堆栈计算后缀表达式
使用堆栈计算后缀表达式一、实现栈结构根据栈的先进后出的特点,很容易设置栈结构的接口:入栈、出栈、判空、size()等。可以用线性表的方法来实现一个栈结构,其实也就两种,用链表或数组实现栈。但是,在C++标准库中已经为我们实现了栈结构,而且是按照最高效率、最优的标准实现的,可以放心的使用C++标准库提供的栈结构,以C++一贯的作风,其实现的栈结构是一个栈类型,定义在<stack&g...原创 2019-01-29 16:01:18 · 5456 阅读 · 1 评论 -
斐波那契数列解法
斐波那契数列解法1、概念在数学上,费波那契数列是以递归的方法来定义:F0=0F1=1Fn=Fn-1+Fn-2(n≧2)用文字来说,就是费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出。首几个费波那契系数是:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233……(OEIS中的数列A000045)特别...原创 2019-01-28 17:08:28 · 1555 阅读 · 0 评论 -
十大经典排序算法
十大经典排序算法 排序算法可以分为内部排序和外部排序。内部排序是数据记录在内存中进行排序。而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。关于时间复杂度:平方阶(O(n2))排序各类简单排序:直接插入、直接选...原创 2019-01-25 14:32:41 · 1094 阅读 · 0 评论 -
两个栈实现一个队列
用栈实现队列1、栈的特点栈的特点是先进后出,进出元素都是在同一端(栈顶)。入栈:出栈:2、队列的特点队列的特点是先进先出,出入元素是在不同的两端(队头和队尾)。入队:出队:3、两个栈实现队列我们拥有两个栈,可以让其中一个栈作为队列的入口,负责插入新元素;另一个栈作为队列的出口,负责移除老的元素。队列的主要操作无非有两个:入队和出队。在...原创 2018-12-19 16:40:42 · 61442 阅读 · 10 评论 -
外部排序
外部排序 给你一个包含20亿个int类型整数的文件,计算机的内存只有2GB,怎么给它们排序?一个int数占4个字节,20个亿需要80亿字节,大概占用8GB的内存,而计算机只有2GB的内存,数据都装不下!可以把8GB分割成4个2GB的数据来排,然后在把他们拼凑回去。如下图: 排序的时候可以选择快速排序或归并排序等算法。为了方便,我们把排序好的2G有序数据称...原创 2018-11-26 16:21:45 · 22354 阅读 · 9 评论 -
树、森林和二叉树的转换
树、森林和二叉树的转换1.树转换为二叉树(1)加线。在所有兄弟结点之间加一条连线。(2)去线。树中的每个结点,只保留它与第一个孩子结点的连线,删除它与其它孩子结点之间的连线。(3)层次调整。以树的根节点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明。(注意第一个孩子是结点的左孩子,兄弟转换过来的孩子是结点的右孩子)2.森林转换为二叉树(1)把每棵树转换为二叉树。...原创 2018-08-14 23:27:32 · 698 阅读 · 0 评论 -
冒泡排序优化
什么是冒泡排序?冒泡排序的英文Bubble Sort,是一种最基础的交换排序。大家一定都喝过汽水,汽水中常常有许多小小的气泡,哗啦哗啦飘到上面来。这是因为组成小气泡的二氧化碳比水要轻,所以小气泡可以一点一点向上浮动。而我们的冒泡排序之所以叫做冒泡排序,正是因为这种排序算法的每一个元素都可以像小气泡一样,根据自身大小,一点一点向着数组的一侧移动。具体如何来移动呢?让我们来看一个栗子:...转载 2018-07-24 22:37:41 · 258 阅读 · 0 评论 -
(七)基数排序
基数排序1、思想与概念 基数排序(radix sort)是一种用在卡片排序机上的算法。基数排序是先按最低有效位进行排序来解决卡片排序问题的。然后算法将所有卡片合并成一叠,其中0号容器中的卡片都在1号容器中的卡片之前,而1号容器中的卡片又在2号容器中的卡片前面,以此类推。之后,用同样的方法按次低有效位对所有的卡片进行排序,并把拍好的卡片再次合并成一叠。重复这一过程,直到对所有的d位数字都进行了...原创 2018-05-07 20:49:30 · 474 阅读 · 0 评论 -
(六)计数排序
计数排序1、计数排序思想 计数排序假设n个输入元素中的每一个都是在0到k区间的一个整数,其中k为某个整数。当k=O(n)时,排序的运行时间为O(n)。 计数排序的基本思想是:对每一个输入元素x,确定小于x的元素个数。利用这一信息,就可以直接把x放到它在输出数组中的位置。当有几个元素相同时,要做修改,不能把它们放在同一个输出位置上。2、伪代码*COUNTING-SORT(A, A.len...原创 2018-05-07 11:22:21 · 388 阅读 · 0 评论 -
(五)快速排序
快速排序1.快速排序的描述通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,基准数据排在这两个子序列的中间;然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。采用分治思想,对一个输入的子数组A[p…r],按以下三个步骤进行排序:分解:以数组A[p]为基准元素将A[p…r ]划分成三段A[p…q-1]...原创 2018-05-05 09:28:20 · 222 阅读 · 0 评论 -
(三)最大子段和问题
1.概念求数组的和最大的非空连续子数组,这样的连续的子数组称为最大子数组(maximum subarray)2.常规方法(O^3)/* 最大子段和问题 O^3*/#include <iostream>using namespace std;//打印数组void printArray(int *arr, int strat, int last){ for (int i = ...原创 2018-04-26 16:35:40 · 867 阅读 · 1 评论 -
(九)快速排序随机化版本
快速排序随机化版本1、描述 采用一种称为随机抽样(random sampling)的随机化技术,使得分析更加简单。与始终采用A[r]作为主元的方法不同,随机抽样是从子数组A[p…r]中随机选择一个元素作为主元。首先将A[r]与从A[p…r]中随机选出的一个元素交换。通过对序列p,…,r的随机抽样,可以保证主元元素x=A[r]是等概率地从子数组的r-p+1个元素中选取的。PARTITIO...原创 2018-05-10 16:28:51 · 1072 阅读 · 0 评论 -
(八)桶排序
桶排序1、思想概念 桶排序(bucketsort)假设输入数据服从均匀分布,平均情况下它的时间代价为O(n)。计数排序假设输入数据都属于一个小区间内的整数,而桶排序则假设输入是由一个随机过程产生,该过程将元素均匀、独立地分布在[0,1)区间上。 桶排序将[0,1)区间划分为n个相同大小的子区间,或称为桶。然后,将n个输入数分别放到各个桶中。因为输入数据是均匀、独立地分布在...原创 2018-05-09 15:29:32 · 266 阅读 · 0 评论 -
(四)堆排序
堆排序1、堆概念(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树。树上的每一个结点对应数组中的一个元素。除了最底层外,该树是完全充满的,而且是从左向右填充。表示堆的数组A包括两个属性:A.length给出数组元素的个数,也表示有多少个堆元素存储在该数组中。只有A[0…A.length]中存放的是堆的有效元素。树的根结点是A[0],给定一个结点的下标i,它的父结点、左孩子、右孩子的下标://父...原创 2018-05-02 17:11:46 · 188 阅读 · 0 评论 -
(一)C++插入排序
一 插入排序1.概念 插入排序对于少量元素排序,是一种有效的算法。就像打纸牌一样,把每次摸到的纸牌放入恰当的位置,排好顺序。2.算法思想 INSERTION_SORT(A)1 for i=1 to A.len2 temp=A[i]3 j=i-14 while j>=0 and A[j]>temp5 A[j + 1] = A[j]6 A[j] = t...原创 2018-04-10 21:13:13 · 134 阅读 · 0 评论 -
(二)C++分治算法下的归并排序
分治算法下的归并排序1、分治思想将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。分治模式在每层递归时都有三个步骤:(1) 分解原问题为若干子问题,这些子问题是原问题的规模较小的实例。(2) 解决这些子问题,递归地求解各子问题。然而,若子问题的规模足够小,则直接求解。(3) 合并这些子问题的解成原问题的解...原创 2018-04-14 23:28:11 · 1321 阅读 · 0 评论 -
C++归并排序非递归
归并排序非递归1.算法思想开始以间隔为1进行归并,也就是说,第一个元素跟第二个元素进行归并,第三个与第四个元素进行归并;然后,再以间隔为2进行归并,第一个元素到第四个元素进行归并,第五个元素到第八个元素进行归并;再以间隔2*2进行归并,同理,直到2*k超过数组长度为止。2.具体代码#include <iostream>#include <vector&...原创 2019-05-19 17:19:44 · 2642 阅读 · 2 评论