算法复杂度分析 算法复杂度有时间和空间两种,每种都可用大$O$,大$\Theta$ ,大$\Omega$,小$o$,小$\omega$ 进行表示 大O表示法 大O表示法是我们在分析算法复杂度时最常用的一种表示法。 大O表示法全称为只可以表示函数运行时间和占据空间的上限,即用于描述算法的最坏复杂度。 关于大O表示法的更详细解读,参考这篇博客:图解大 O 表示法 大$\Omega$表示法 当函数的大小只有下界,没有明确的上界的时候,可以使用大Ω表示法,该渐进描述符一般用与描述算法的 最优复杂度 。 大$\Theta$表示法 如果一个函数 $f(N)$ 既是 $O(g(N))$ …
每个计算机都有一个字长,字长决定虚拟地址空间的最大大小,对当前大多数64位计算机而言,虚拟地址空间最大为$2^{64}$个字节,即程序最多访问约为$1.6 \times 10^{19}$个字节。 假设一个int型的变量x的地址为0x100,那么x的四个字节将被存储在存储器的0x100, 0x101, 0x102, 0x103位置。 大端序:最高有效字节存储在最前面的位置 小端序:最低有效字节存储在最前面的位置
信息在程序中的表示 系统中的所有信息——包括磁盘文件、存储器中的程序、存储器中存放的用户数据以及网络上传送的数据,都是由一串位表示的。区分不同数据对象的唯一方法是我们读到这些数据对象的上下文。 编译系统 程序在系统上运行,需要先经过编译,转化为一系列的低级语言指令,这些指令并被以可执行文件的格式打包,以二进制磁盘文件的形式存放起来。整个编译系统由四部分组成:预处理器、编译器、汇编器和链接器。 以C语言程序为例解释这四个阶段: 预处理阶段:预处理器将源程序进行修改,根据源文件的命令读取对应系统文件的内容,将其插入到程序文本中,得到另一个被修改的源程序(文本文件); 编译阶段:经过编译器将修改后 …
背包、队列和栈都是集合的数据类型,区别仅在于删除或者访问对象的顺序不同。 而对于存储对象集合的方式,有数组和链表两种,常被分别称为顺序存储和链是存储。 下面关于每个数据类型,都将提供数组和链表两种代码实现方式。 链表是一种递归的数据结构,它或者为空(null),或者是指向一个结点(node 的引用, 该结点含有一个泛型的元素和一个指向另一条链表的引用 特点: 可以处理任意类型的数据 所需的空间总是和集合的大小成正比 操作所需的时间总是和集合的大小无关 背包(Bag) 帮助用例收集元素并迭代遍历所有收集到的元素 特点: 不支持删除元素 迭代顺序不确定且与用例无关 数组实现: 链表实现: …
最近我决定将自己的博客从gihub.io迁移到自己的独立域名上,并且网站的构建也打算从github开源模板套用转到使用Hugo进行搭建,改变整体风格,让我的小站看起来更日常化、更“软”一点。 基于Hugo模板的网站搭建部署大致需要经过如下步骤: Hugo环境配置、模板选择与网站搭建 域名与服务器注册、备案 云服务器配置 调试并完成部署 Hugo环境配置、模板选择与网站搭建 如果想要创建一个个人博客网站我们首先要在本地搭建、设置好自己想要的网站内容。Hugo作为一个生态良好的静态网站生成器可以极大地简化我们的搭建流程。 按照Hugo官方文档进行构建,首先确保安装了相关依赖(git、 go、 以及 …
前几天在看深度学习经典之作(花书)的时候突然发觉自己的数学基础过于薄弱,于是打算恶补机器学习相关数学理论,进而熟练地打开csDIY网站,找到了吴恩达讲授的cs229这门课程。该说不愧是吴恩达,课程中对于机器学习算法的数学推导和解释深入浅出、赏心悦目,但是碍于自己薄弱的数学基础,当听到Hessian矩阵时还是感到一头雾水(小声bb:线代高数老师也不讲这个呀orz),遂上网查找相关资料。经过一番查询,也算是有了一点自己的体悟和收获,于是就有了这篇博客。 (主要参考了wikipedia上的解释并且掺杂了一些个人想法,或有浅薄之处,期望批评指正) 雅可比矩阵(Jacobian matrix) 如果有一 …
写在之前:本篇文章是我这个学期某门选修课的大作业,花费了我接近三个下午完成,发布该博客以做记录留念。(文章中某一些看起来比较奇怪的格式可能是因为之前要用pandoc生成pdf,其要求的某些格式比较奇怪,markdown无法正确编译,也无需在意) 一. 引言 1. 算法简介 插值是一种通过已知的、离散的数据点,在范围内推求新数据点的过程或方法[@插值算法的介绍及其在数学建模中的应用]。在真实场景中,往往我们获取的数据会出现遗漏或者较少的情况,插值可以模拟并产生一些新的合理的数据来满足我们的需求;此外,插值还可以解决一些短期预测问题[@插值]。 样条插值是一种将整个数据范围分为多个区间,使用特殊的 …