"Mathematical Analysis of Algorithms" 阅读心得 "Mathematical Analysis of Algorithms"是著名计算机界大神Knuth在1971年发表的论文.以前只是听说Knuth非常神,看了这篇论文才体会到Knuth到底有多神-Orz 此外,特别感谢 @solaaaaa 聚聚,没有他的指导我可能根本看不懂这篇论文-... 这篇文章要解决什么问题? 作为算法分析这一领域的早期论文,这篇文章回答了以下两个问题: 算…
开头废话 这个问题是Donald.E.Knuth在他发表的论文Mathematical Analysis of Algorithms中提到的,这里对他的算法分析过程给出了更详细的解释. 问题描述: 给定一个数组a[1,2,...,n],用尽量少的比较次数找出数组中第t大的数.(假定这n个数两两不同). 算法描述: 对于这个问题,可以很容易想到对应的算法.一个 \(O(n\log n)\) 的排序算法总能解决问题(然鹅今天我们并不对数组进行完全的排序). 参照快速排序中的Partition操作,将…
问题描述 把数列\((x_1,x_2,\cdots,x_n)\)变换顺序为\((x_{p(1)},x_{p(2)},\cdots,x_{p(n)})\),其中\(p\)是\(A=\{1,2,3,\cdots,n\}\)的一个排列,要求只使用\(O(1)\)的额外空间.例如,当数列为\((10,20,30,40)\),\(p\)为\((3,1,2,4)\)时得到的数列是\((30,10,20,40)\). 算法描述 对于映射\(p:A\rightarrow A\),它的含义是"排列后的数组每个元素…
算法分析 Analysis of Algorithms 为什么要做性能分析?Why performance analysis? 在计算机领域有很多重要的因素我们要考虑 比如用户友好度,模块化, 安全性,可维护性 等等.但是为什么要关心性能呢? 原因很简单,如果有了很好的性能,我们就可以实现以上那些.所以性能相当于货币,有了货币我们就可以购买其他的东西.另外一个原因是研究proformance 非常有趣. 两个算法,到底哪一个好呢?Given two algorithms for a task,…
今天我们开始简单的介绍数学分析这门课程,参考教材是Walter Rudin著的<Principles of Mathematical Analysis> 对于一门新课你最开始可能会问的是:这门课讲述了一个什么故事?简单的翻阅了一下这本书的目录,数学分析这一块,里边有微积分里的东西:微分法.级数.多元函数这类东西,当然也有离散数学中一些集合.关系的东西,因此,我们不能妄下论断说,数学分析就是带证明的微积分,但是,数学分析到底是讲述了一个怎样的故事呢?让我们怀揣着这个问题走进这门课. 数学作为工具…
课程信息 6.046 Design and Analysis of Algorithms…
Lecture notes of Mathematical analysis Preliminary theory Teaching purpose: Mathematical analysis is a watershed between high school and university. Its core is the thought of limit. Before introducing the concept of limit, let's first review the kno…
我们生活在大数的时代 培养数量级的敏感! Tip:见招拆招 作为工程师,你先要能实现出来. 充实基础,没有什么不好意思 哪怕不完美.但是有时候完成比完美更重要. 之后再去想优化 P.S.作者Robert Sedgewick的导师是Knuth(高德纳!) Conclusion First 1.Running Time Operation table 2.Memory 1 SOP - Analysis 2 Observations Measuring the running time - autom…
算法分析 Introduction 有各种原因要求我们分析算法,像预测算法性能,比较不同算法优劣等,其中很实际的一条原因是为了避免性能错误,要对自己算法的性能有个概念. 科学方法(scientific method)也适用于算法分析,它提供了一个预测性能和比较算法的框架: Observe 观察真实世界的某些特征 Hypothesize 根据观察结果提出假设模型 Predict 用模型预测未来的事件 Verify 继续观察来核实预测的准确性 Validate 重复直到预测和观察一致 此外还有两条原…
1.使用gdb这个调试工具. 在linux使用该调试工具非常简单.它的价值非常大,可以告诉你函数相互调用的逻辑(bt命令),告诉你函数执行的情况(通过br命令以及n,c命令单步跟踪函数每一个语句的执行),告诉你每个函数变量的值(p命令). (1)首先打开mysql服务器 ./mysqld (2)重新开始一个客户端,打入mysql -uroot -p,输入密码进入mysql,以下称mysql客户端 (3)重新开始一个客户端,打入ps -ef|grep mysql找出mysql的pid,以下称gdb…
php 中header 函数 我可能见多了,只要用来跳转.今天在阅读TP源码的时候发现,header函数有第三个参数.有些困惑所以找到手册查阅下,发现 void header ( string $string [, bool $replace = true [, int $http_response_code ]] ) 瞬间就明白了第三个参数是用来指定,返回状态码的. 还有看到parse_str 函数 第二个参数传递了一个数组.有些困惑一查手册发现 void parse_str ( string…
        在阅读Spark ML源码的过程中,发现很多机器学习中的优化问题,都是直接调用breeze库解决的,因此拿来breeze源码想一探究竟.整体来看,breeze是一个用scala实现的基础数学库,breeze之于Spark ML,就像numpy和scipy之于sklearn一样,很多Spark ML中的优化问题,看到后面发现都是在breeze库中解决的,对于有志于理解底层实现的朋友来说,breeze是一本很好的教科书.         虽然breeze仅2.5MB代码,比Spark…
第一天阅读源码及创建时序图.(第一次用prosson画时序图,挺丑..) 1.  调用 SqlSessionFactoryBuilder 对象的 build(inputStream) 方法: 2.  SqlSessionFactoryBuilder 会根据输入流 inputStream 等信息创建XMLConfigBuilder 对象 ; 3.  SqlSessionFactoryBuilder 调用 XMLConfigBuilder 对象的 parse() 方法: 4.  XMLConfigB…
虽然读这本书是老师布置的作业,但是读了几页后就被书中的内容所吸引住了.或许是因为我也是学这个专业的,所以书中的一些内容让我觉得非常的有兴趣.作为一个学习软件工程的大一学生还没真正的认识到这个专业的深奥,正是通过这本书的阅读让我这个一无所知的年轻人懂得这个行业.这本书不仅仅让我懂得了这些,而且让我学习这个专业更加的感兴趣,更是get到了学习和生活上的一些“新技能”. 想要学好这个专业不仅仅平时要认真学习,生活中还要随时抽空打打代码打好基础. 真正基础雄厚的人应该是可以将常用的基础性知识熟记成诵的人…
XV6操作系统是MIT 6.828课程中使用的教学操作系统,是在现代硬件上对Unix V6系统的重写.XV6总共只有一万多行,非常适合初学者用于学习和实践操作系统相关知识. MIT 6.828的课程网站是https://pdos.csail.mit.edu/6.828/.XV6操作系统有官方文档,英文版在前面的网站可以下载,中文版翻译参见https://th0ar.gitbooks.io/xv6-chinese/content/. 此部分内容另有PPT 前置知识 在阅读XV6操作系统代码前,需要…
例子: 3-Sum 给定N个整数,这里面有多少个三元组,使其三个整数相加为0,如上面的例子为有4个三元组. 这个问题是许多问题如计算机几何,图形学等的基础. 用简单粗暴的方式来解决3-Sum问题 通过三个for循环来执行 那么怎么计算它运行的时间呢? Java有一个内嵌的函数来计算运行时间:Stopwatch()           我们通过对不同的input size来运行获得运行时间,如上图所示,那么根据这些已得出来的值,我们可以推测出当input size为8K时,它的运行时间为多少吗?…
 Android源代码包含了很多内容,可以实现拍照.计算机.日历.相册.拨号器等功能.配置Android源代码下载环境需要如下几步: (1)创建一个用于存放下载脚本文件的目录:  (2)下载repo脚本文件: (3)创建用于存放Android源代码的目录: (4)初始化: (5)开始下载Android源代码: 下载的Android源代码有时不需要全部代码,只需要一部分源代码就能完成功能,有两种方法: (1)使用repo sync命令,当执行repo init命令初始化的过程中,会在当前目录生成一…
Git是Linux内核代码对源代码进行管理的软件,他的各方面要优与其他同类的源代码管理软件. 安装Git后,查看Git文档在Linux下可以直接使用man命令看指令的帮助文档.安装git-doc后会安装git的文本格式和HTML格式的文档,所有的文档都存在/usr/share/doc/git-doc目录中.以文本形式查看指定的文档可以使用下面的指令.# git help <sub-command> 源代码提交与获取,创建版本库:git init ,任何人想修改Git源代码托管服务器中的源代码,…
按照书中所讲的步骤,第一步先准备好搭建Android开发环境所需要的工具:JDK6或以上版本:Eclipse3.4或以上版本:ADT:CDT:Android SDK:Android NDK;交叉编译环境:Linux内核源代码:Android源代码:用于调试开发板的串口工具:minicom. 安装JDK:下载后在Linux终端输入# gedit /etc/profile指令打开profile文件来设置PATH环境变量.然后通过输入两个书中的指令来配置好JDK. 搭建Android应用程序开发环境:…
首先了解到Android系统架构是由四层构成:其中第一层是Linux内核,他的作用是负责Linux的驱动程序以及内存.进程.电源等管理操作:第二层是C/C++代码库,也就是Linux下.so的文件:第三层是Android SDK API,它是由Java编写的:第四层是应用程序,在这层运行系统所有Android应用程序. 为了实现让Android可以是别平台上的各种硬件设备,就用到了Linux内核,主角就是Linux驱动.系统移植有移植CPU架构和移植Linux驱动,其中移植Linux驱动最为重要…
我是一个不爱看书的人,认为看那些又臭又长废话连篇的书是在浪费时间,但我不认为在那么多的书中没有好书,在一次的职业生涯规划中老师推荐了这本书,一开始认为不值得一看,但还是拿了起来,读了有不少的感触. 书是人类进步的阶梯!我现在不觉得什么书是不值得看的,只有取其精华,去其糟粕,才能发现它的好它的美. 在我初中三年的学习生涯,家里发生了许多的大事,使得自己抛弃自己,再加上父母离婚两地分居,也不怎么管束,自己像风筝在大风中,虽然有线但在大风中难以拉回手中.由于对学习升学不报什么希望了,一心想一个人去外地…
时间复杂性的计算一般而言,较小的问题所需要的运行时间通常要比较大的问题所需要的时间少.设一个程序P所占用的时间为T,则 T(P)=编译时间+运行时间. 编译时间与实例特征是无关的,且可假设一个编译过的程序可以运行多次而无需再编译.因此分析程序的时间特性就只需考虑程序的运行时间. 令程序P的运行时间为tp(n),其中n是所要求解问题的实例特征.由于编写程序时,影响tp的许多因素还是未知的,所以只能对tp进行估算.由于代码P的主要操作通常包括加.减.乘.除.比较.读.写等,而这些操作的执行时间是可预…
FileCleanTracker: 开启一个守护线程在后台默默的删除文件. /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership.…
Question 1 Suppose that you time a program as a function of N and producethe following table. N seconds------------------- 1024 0.000 2048 0.001 4096 0.007 8192 0.029 16384 0.121 32768 0.519 65536 2.156 131072 9.182 262144 38.784 524288 164.585 10485…
垃圾收集 程序计数器.虚拟机栈.本地方法栈三个区域随线程而生,随线程而灭:这几个区域的内存分配和回收都具备稳定性,不需要过多的考虑回收的问题.而Java堆和方法区则不一样. Java堆中存储了几乎所有的对象实例,垃圾收集器进行对堆的回收之前,需要判断这些对象是否还存活 一.判断对象是否存活 判断对象是否还活着,主要有两种方法 1.引用计数法 给对象添加一个引用计数器,每当一个地方引用时,计数器值加1: 每当一个引用失效时,计数器减1: 任何计数器为0的对象为不可能被使用的对象. 优点:实现简单,…
Java中提倡的自动内存管理最终可以归结为自动化的解决两个问题: 给对象分配内存 回收分配给对象的内存 先说说回收这一方面的两个主要知识点 一.垃圾收集算法 1.标记-清理算法 首先标记出所有需要回收的对象,然后在标记完成后统一回收所有被标记的对象(适用老年代) 两个缺陷:(1)效率问题,标记和清除两个过程效率都不高 (2)空间问题,标记清除算法会产生大量不连续的内存空间碎片,导致无法分配较大对象 2.复制算法 将可用内存按容量划分为等大小的两块,每次只使用其中的一块.清理时将还存活着的对象复制…
JVM(Java Virtual Machine) 即Java虚拟机,是一种用于计算设备的规范,用于运行Java程序编译后得到的字节码文件(Class文件) 一.JVM的内存区域 1.程序计数器(Programing Counter Register) 用于选取需要JVM执行的字节码指令,最简单的一种方法就是通过修改程序计数器的值来达到选取下一条需要执行的字节码指令的目的. 如在多线程中CPU时间片切换时,可以通过线程私有的程序计数器来知道这次应当执行的是哪一条字节码指令. 每个线程都会有一个独…
IO 标准库类型和头文件 iostream istream 从流中读取 ostream 写到流中去 iostream 对流进行读写:从 istream 和 ostream 派生而来fstream ifstream 从文件中读取:由 istream 派生而来 ofstream 写到文件中去:由 ostream 派生而来 fstream 读写文件:由 iostream 派生而来sstream istringstream 从 string 对象中读取:由 istream 派生而来 ostringstr…
ThreadPoolExecutor.execute()源代码提供了大量凝视来解释该方法的设计考虑.以下的源代码来自jdk1.6.0_37 public void execute(Runnable command) { if (command == null) throw new NullPointerException(); if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(command)) { if (runState == R…
新年过后我们迎来大一下学期,想想刚迈入大学的我们,充满着好奇与兴奋,仿佛就在昨天.时光飞逝而今,虽经过一学期的学习,仍对计算机专业充满困惑,对未来充满迷茫. 在我感到迷茫的时候,老师给我们介绍了这样的一本书<我是一只IT小小鸟>,起初在课堂上,我以为这本书应该也只是描写一些于IT相关的知识而已,于是乎只是仅仅像对待完成作业那样抽空百度了关于这本书的信息.然而却有些欣喜地发现<我是一只IT小小鸟>竟然是一本关于IT生涯的励志书籍.这本书是由很多不同作者不同篇幅组成的,他们基本都有不同…