算法导论
文章平均质量分 74
CFhM_R
所谓的光辉岁月,不是那些闪亮的日子,而是无人问津时,你对梦想的坚持
展开
-
算法导论例程——快速排序
快速排序是一种最坏情况复杂度为o(n^2),平均时间复杂度为o(nlgn)的排序算法,且nlgn隐含的常数因子非常小,最坏情况发生的概率也不高,进行的是原址排序,所以是采用度最高的一种排序算法,在c++的stdlib库中特别封装了qsort函数方便用户使用。 快速排序是冒泡排序的一种升级版本,主要思想就是选择数组中的一个值作为关键字(key),将数组中所有比key小的放在key前,比key大的放原创 2016-02-05 20:37:19 · 445 阅读 · 0 评论 -
算法导论例程——堆排序(大根堆为例)
堆排序是具有原址性的排序,复杂度为o(nlgn)。 首先要建立一个“堆”的概念,堆 可以理解为二叉树的一种,是完全二叉树,即除了最后一层外节点没有缺失,所以可以用数组来表示。对于下标为i的节点,它的子树的左节点的下标为2*i,右节点为2*i+1,父树的节点下标为i/2(向下取整)。而在程序设计中,使用位运算来代替直接*2可以提高运行速度。而某些编译器中会把一些特定的乘法运算改写为位运算。 只把原创 2016-02-04 23:12:16 · 2808 阅读 · 0 评论 -
算法导论例程——红黑树
红黑树是比较重要的数据结构,作为一个典型的平衡二叉树(没有一条简单路径是其他路径的二倍)。它与二叉搜索树的区别是它的结点多了一个属性——color,color有两种值,red和black,颜色的选取遵循以下原则: 1)每个节点是红色的,或是黑色的; 2)根节点是黑色的;(松弛红黑树 relaxed red-black tree的根节点可以是红色) 3)每个叶节点(NIL)是黑色的; 4)如原创 2016-02-14 00:57:10 · 609 阅读 · 0 评论 -
算法导论例程——归并排序
归并排序,是把要排序的序列不断二分(不满足向前取整),直到分到都只有一个元素时,保证有序,然后开始合并,直接在原数组的位置进行替换,即merge函数中收元素为什么要用start去加的原因。#include void mergeSort(int a[], int start, int end); void merge(int a[], int start, int mid, int end);原创 2016-02-02 13:03:30 · 725 阅读 · 0 评论 -
算法导论例程——切割钢条问题(动态规划)
这是一道基础的线性dp问题,问题描述如下。 某厂家给出了长度为i的钢条的价格p[i],现某公司有长度为n的钢条,想要将其切割之后出售给厂家,求售得价格最高的切割方案。 这道题可以用记忆化搜索来完成,也可以用递推dp,转移方程比较麻烦的一点就是由于切割长度多种,钢条长度在改变时受到影响,因此在计算时又需要从头开始。 #include #include using namespace std原创 2016-02-12 01:35:01 · 575 阅读 · 0 评论 -
算法导论例程——二叉搜索树
二叉树的定义是递归的:每一个结点都至多含有左右两个子结点。二叉树是无向无环图,度不大于2。 二叉搜索树是二叉树的一种,它具有一下的性质: 1)任一结点的左子结点都不大于该结点; 2)任一结点的左子结点都不小于该结点; 二叉搜索树根据它的性质可以设计出一个很简单的递归算法来遍历它的每一个结点。 首先二叉树的声明如下: typedef struct binary_tree { int n原创 2016-02-10 23:18:52 · 531 阅读 · 0 评论 -
算法导论例程——哈希表
哈希表(hash table)是普通数组概念的推广,对于一个比较小的规模的数据,我们对其存储采用的是将其存在一个等规模的数组中,并且直接根据数组下标对其进行寻址,这被称为直接寻址法。 而当数据规模增大到一定程度时,我们采用直接寻址法进行遍历时会打打加重程序的时间复杂度,而一种理想的解决办法就是根据数据的某一关键字(这里假设数据元素含有其他卫星数据,这在实际问题中是很常见的)动态的分配存储空间,将原创 2016-02-10 01:47:59 · 851 阅读 · 0 评论 -
算法导论例程——队列
队列是一种delete的方式同栈不同的数据结构,遵循先进先出原则,因此对于队列我们需要它的head和tail两个属性来描述入队和出队。队列的结构如下 #define LENGTH 1000 typedef struct { int num[LENGTH]; int head; int tail; }queue;这里把队列的长度宏定义了具体的数值,在实际应用时可以使用sizeof来获取,或以原创 2016-02-09 02:08:49 · 642 阅读 · 0 评论 -
算法导论例程——栈
我们把一系列由算法操控的。能完成扩大、缩小或发生其他变化的集合称为是动态集合,能够实现动态集合操作的几种数据结构,是计算机一些高级程序的基础。这里我们首先介绍两种最基本的数据结构——栈(stack)和队列(queue)。 栈和队列都是线性的数据结构,他们的形式与一维数组一样,但不同的是他们的delete操作是规定好的,栈遵循的是“后进先出”(last-in,first-out,LIFO)原则,即原创 2016-02-09 01:34:13 · 671 阅读 · 0 评论 -
算法导论例程——基数排序
基数排序(radix_sort)可以被称为是计数排序的升级版,他的原理是基于以前的卡片式排序方法,这里把要排序的每个整数看作是一张卡片,把整数的各位数字看作是卡片上的关键字,在进行计数排序时,我们逐位扫描整数的各位数字,并以该数字为关键字进行整体的排序,从低位到高位,在排序时我们可以借助结构体进行辅助,基数排序本身提供思路,它使用的是较为稳定的技术排序作为核心的排序算法,这样保证算法时间复杂度为o原创 2016-02-08 03:17:39 · 733 阅读 · 0 评论 -
算法导论例程——计数排序
之前写过的所有根据比较决定序关系的排序,根据决策树得出他们的时间复杂度都在omega(nlgn),今天要写的一种排序,是一种复杂度为o(n+k)的排序,也就是在线性时间复杂度内的程序,其中k为待排序数列中最大的元素,这也是计数排序的一点点局限性,就是必须要知道这个最大值是多少。 原理是这样,我们遍历待排序数组,在另一个大小恰好为k的数组c中以c[a[i]]的方式记录a中每个元素出现的个数,进而求原创 2016-02-07 01:06:55 · 608 阅读 · 0 评论 -
算法导论例程——最大子数组问题
最大子数组描述的是这样的一个问题:给定一个整型数组a[],规模为n,求其中连续的m个元素之和使其最大。其中这m个元素被称为是数组a的子数组。 最大子数组问题的求解过程可以分成三种情况,对给定数组,找到中点一分为二,它的最大子数组有可能在左边的部分,有可能在右边的部分,还有可能跨过(cross)左边和右边,那么对于最大子数组在左边或右边的情况,我们又可以把他们看作原问题的一个较小规原创 2016-02-03 01:42:09 · 581 阅读 · 0 评论