线程

与进程近似,线程是允许应用程序并发执行多个任务的一种机制。如下图所示,一个进程可以包含多个线程。同一个程序的所有线程均会独立地执行相同的程序,且会共享统一份全局内存区域,包括初始化数据段(initialized data)、未初始化数据段(uninitialized data)以及堆内存段(heap segment)。

阅读更多

分治策略-卷积

卷积及其应用

向量计算

给定向量:

  • a=(a0,a1,...,an1)a=(a_0, a_1, ..., a_{n-1})

  • b=(b0,b1,...,an1)b=(b_0, b_1, ..., a_{n-1})

向量和: a+b=(a0+b0,a1+b1,...,an1+bn1a+b=(a_0+b_0,a_1+b_1,...,a_{n-1}+b_{n-1}

阅读更多

堆与栈

进程内存布局

如下图所示,对于每个程序所分配的内存由很多部分组成,通常称之为“段”(segment)。

  • 文本段(text)包括进程运行的程序机器语言指令。文本段具有只读属性,以防止进程通过错误指针意外修改自身指令。

  • 初始化数据段(BSS)包括为未进行显式初始化的全局变量和静态变量。

    对于初始化和未初始化数据段即用户初始化数据段(user-initialized data segment)和零初始化数据段(zero-initialized data segment)。

  • 栈(stack)是一个动态增长和收缩的段,由栈帧(stack frames)组成。系统会为每个当前调用的函数分配一个栈帧。栈帧中存储了函数的局部变量(所谓自动变量)、实参和返回值。

  • 堆(heap)是可在运行时(变量)动态进行内存分配的一块区域。堆顶端成为program break。

阅读更多

分治策略-幂乘问题.md

幂乘问题

输入:aa为给定实数,nn为自然数

输出:ana^n

传统算法思想

顺序相乘 an=(...(((aa)a)a)...)aa^n=(...(((a\quad a)a)a)...)a

乘法次数:Θ(n)\varTheta (n)

阅读更多

分治策略-快速排序.md

基础思想

  • 用首元素xx作划分标准,将输入数组AA划分成不超过xx的元素构成的数组ALA_L,大于xx的元素构成的数组ARA_R。其中,AL,ARA_L,A_R从左到右存放数组AA的位置。

  • 递归地堆子问题ALA_LARA_R进行排序,直到子问题规模为11时停止。

阅读更多

分治策略-改进.md

减少子问题数

依据

分治算法的时间复杂度方程

W(n)=aW(n/b)+d(n)W(n) = aW(n/b) + d(n)

aa:子问题数,n/bn/b:子问题规模,d(n)d(n):划分与综合工作量。

阅读更多

分治策略-算法设计思想.md

算法设计思想

  • 将原问题归结为规模为n-1的2个子问题;

  • 继续归约,将原问题归结为规模为n-2的4个子问题。继续…,当子问题规模为1时,归约过程截止。

  • 从规模1n-1,陆续组合两个子问题的解。直到规模为n

  • 分析方法:递推方程。

阅读更多

分治策略-基础.md

基础思想

分治策略(Divide and Conquer)基本思想:

  1. 将原始问题划分或者归结为规模较小的子问题;

  2. 递归或迭代求解每个子问题;

  3. 将子问题的解综合得到原问题的解。

阅读更多

分治策略-典型算法.md

选择问题

选最大和最小

输入:集合LL(含nn个不等的实数)

输出:LL中的第ii小的元素

  • i=1i=1,称为最小元素

  • i=ni=n,称为最大元素

位置处在中间爱你位置的元素,成为中位元素

nn为奇数,中位数唯一,i=(n+1)/2i=(n+1)/2

nn为偶数,可指定为i=n/2+1i=n/2+1

选最大算法:顺序比较,在最坏情况下的时间为W(n)=n1W(n)=n-1

阅读更多