算法导论笔记
yingchenwy
This is real. This is me.
展开
-
《算法导论》学习笔记之Chapter10基本数据结构---栈的数组实现
下面用数组实现栈的代码: public class Stack { /** * 本类是利用数组实现的栈类,实现的功能包括: 栈是否为空;是否为满;压入;弹出;peek;得到栈大小数;栈顶位置; * * @author FX * @return */ // 存放元素的数组 int[] a; // 栈的最大长度 private int size; // 栈顶原创 2017-12-08 11:19:43 · 193 阅读 · 0 评论 -
《算法导论》学习笔记之Chapter9中位数和顺序统计量
第9章 中位数和顺序统计量 先定义:在一个由n个元素组成的集合中,第i个顺序统计量是该集合中第i小的元素。一个中位数是它所属集合的“中点元素”。当n是奇数时,中位数是唯一的,位于i=n/2处。当n为偶数时,中位数有两个,分别位于i = n/2和i=n/2+1处。不考虑n的奇偶性,中位数总是出现在i=(n+1)/2向下取整处,也叫下中位数,和i=(n+2)/2向上取整处,也叫上中位数。本书默认下中原创 2017-12-07 11:33:41 · 279 阅读 · 0 评论 -
《算法导论》学习笔记之Chapter8线性时间排序
第8章 线性时间排序 前面介绍的包括归并排序,堆排序和快速排序,最后的次序都依赖于元素之间的比较,叫做比较排序。 归并排序和堆排序都是渐近最优的,且任何已知的比较排序最多就是在常数因子上优于他们。即比较排序的时间复杂度下界就是Ω(nlogn)。 线性时间排序算法,包括:基数排序,计数排序和桶排序,是靠运算不是比较来排序的,下界Ω(nlogn)不是他们的下界。 计数排序:假设n个输入原创 2017-12-06 17:39:26 · 206 阅读 · 0 评论 -
《算法导论》学习之关于如何利用排序算法,从1亿个数中,选出最大(小)的100个数
首先声明:本文内容是参考别人的博客,链接为:http://blog.csdn.net/beiyeqingteng/article/details/7534489 前言: 刚刚在CSDN上看到一个网友利用最小堆实现 “ 获取一亿数据获取前100个最大值” 。原帖请看:http://blog.csdn.net/yjflinchong/article/details/7533972。转载 2017-12-06 16:59:01 · 953 阅读 · 1 评论 -
《算法导论》学习笔记之Chapter4.2矩阵乘法Strassen
4.2 矩阵乘法,代码如下: //求两个方阵的乘积 public static int[][] squareMatrixMultiply(int[][] a, int[][] b){ int n = a.length; int[][] c = new int[n][n]; for (int i = 0; i < n; i++){ for (int j = 0; j <原创 2017-12-05 14:57:16 · 320 阅读 · 0 评论 -
《算法导论》学习笔记之Chapter3函数的增长 Chapter4.1分治策略
第三章 函数的增长 这一章主要内容讲得是算法时间增长率,其中需要记住三种表现形式: 具体含义,上图已经表现得很清楚。 (a)表示:如果存在正常量c1和c2,使得对于足够大的n,函数f(n)能“夹入”c1g(n)与c2g(n)之间,则f(n)属于集合θ(g(n))。因为θ(g(n))是一个集合,所以可以记为“f(n)∈θ(g(n))”,表示f(n)是θ(g(n))的成员,通常记原创 2017-12-05 13:23:34 · 243 阅读 · 0 评论 -
《算法导论》Chapter6 堆
6.1-1 高度为h的堆中,元素的个数范围为:2.^(h-1) <= n(h) <= 2.^h-1。 堆的几个基本性质: MAX-HEAPIFY过程,时间复杂度为O(lgn)。他是维护最大堆性质的关键; BUILD-MAX-HEAP过程,具有线性时间复杂度,功能是从无序的输入数据数组中构造一个最大堆; HEAPSORT过程,时间复杂度为O(nlgn),其功能是对一个数原创 2017-12-05 17:56:58 · 251 阅读 · 0 评论 -
《算法导论》学习笔记之Chapter5.1
5.1-2 问题:请描述RANDOM(a, b)过程的一种实现,它只调用RANDOM(0, 1)。作为a和b的函数,你的过程的期望运行时间是多少? 伪代码: [plain] view plain copy RANDOM(a, b) 1 n = b - a + 1 2 generate a new array A[1转载 2017-12-05 16:07:42 · 230 阅读 · 0 评论 -
《算法导论》学习笔记之Chapter13红黑树
第13章 红黑树 红黑树是一种平衡搜索树中的一种,他可以保证在最坏情况下基本动态集合操作时间复杂度为O(logn)。所以,在学习红黑树之前,我需要先去调研一下平衡树; 先看一下平衡树的定义:平衡树,即平衡二叉树(Balanced Binary Tree):它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL(平衡查原创 2017-12-13 15:47:22 · 454 阅读 · 0 评论 -
《算法导论》学习笔记之Chapter12二叉树基本特点,及二叉搜索树(查找树)
第12章 二叉搜索树 在学习二叉搜索树之前,我准备先预习一下二叉树的概念和相关算法。 二叉树拥有结合有序数组和链表的优点,查找数据和在数组中查找一样快,插入删除数据则有和链表一样高效的性能,所以是面试中必问的知识点。 二叉树的基本概念: 结点的度-结点所拥有子树的个数称为该结点的度; 叶结点-度为0的结点称为叶结点,或者终端节点; 分枝结点-度不为0的结点称为分枝结点,或者原创 2017-12-12 15:18:04 · 285 阅读 · 1 评论 -
《算法导论》学习笔记Chapter11散列表
散列表最重要的是散列函数的选择,一个好的散列函数应满足简单均匀散列假设特点:每个关键字都被等可能的散列到m个槽位中的任何一个,并与其它关键字已散列到哪个槽位无关。 遗憾的是上述条件很难检测到是否满足,因为很少能知道关键字散列所满足的概率分布,且各关键字可能并不是完全独立的。 实际中,可应用启发式方法构造性能好的散列函数。设计过程中,充分利用关键字分布的有用信息。 “除法散列”是一种较好的方法原创 2017-12-11 15:46:00 · 372 阅读 · 0 评论 -
《算法导论》学习笔记之Chapter 2-2.1,2.2,2.3插入排序,选择排序,归并排序
本来想写所谓的学习笔记,想来想去还是觉得直接记录自己在学习过程中编写的代码更靠谱。下面就闲话少说,参考文中给的伪代码,用自己熟悉的语言实现。 1:插入排序 package com.clrs.test; public class InsertSort { public static void main(String[] args) { // TODO Auto-generated me原创 2017-12-01 17:51:27 · 291 阅读 · 2 评论 -
《算法导论》学习笔记之Chapter10---数据结构之链表
链表定义:链表是这样一种数据结构,其中的各对象按线性顺序排列,与数组的线性顺序由下标决定不同,链表的顺序是由各个对象里的指针决定。 链表分为:单向链表,双向链表,还有循环链表。本文所讨论的是未排序的双向链表。 链表支持的操作有:查找Search;插入Insert;删除Delete; 查找操作就是从表头开始对比查找,很简单;插入操作,是根据插入的数据的指针属性来寻找要插入的位置;之后修改相关元原创 2017-12-08 19:50:34 · 241 阅读 · 0 评论 -
《算法导论》学习笔记之Chapter7快速排序
第七章 快速排序 对于包含n个数的数组来说,快速排序是一种最坏情况时间复杂度为θ(n.^2)的排序算法。虽然最坏情况时间复杂度很很差,但快速排序通常是实际排序应用中最好的选择,因为他的平均性能非常好:它的期望时间复杂度为θ(nlogn),而且θ(nlogn)中隐含的常数因子非常小。同时,快速排序还能够进行原址排序,甚至在虚存环境中也能很好的工作。 其中基于随机抽样的快排算法,期望时间复杂原创 2017-12-06 15:03:26 · 207 阅读 · 0 评论