09 2018 档案
摘要:分治法https://www.cnblogs.com/zuofaqi/p/9678356.html 引入了最大子数组问题,它有一个更高效的解决方法就是动态规划法 如果已经知道 A[0...i] 的最大子数组,那么 A[0...i+1] 的最大子数组要么是 A[0...i] 的最大子数组,要么是某个子
阅读全文
摘要:原理 将问题分解为几个规模较小但类似于原问题的子问题,递归求解这些子问题,然后合并这些子问题的解来建立原问题的解 分治模式在每层递归时,都有三个步骤:1. 分解原问题为若干子问题,这些子问题是原问题的规模较小的实例。2. 解决这些子问题,递归地求解各个子问题。如果子问题规模足够小,直接求解3. 合并
阅读全文
摘要:考虑上一篇的插入排序,在for循环的每次迭代开始,包含元素A[0...i-1]的子数组是当前排序好的,剩余的数组元素A[i...arrlen]是仍未排序的。我们把A[0...i-1]的这个性质称为一个循环不变式 循环不变式(loop invariants)不只是一种计算机科学的思想,准确地说是一种数
阅读全文
摘要:插入排序的过程是:对于一个无序数组,每个元素与前面元素比较,从后往前比较,如果比其中一个元素小,就把该元素插入比它小的元素前面。 插入排序是原址排序,原址排序指基本上不需要额外的辅助空间,允许少量额外的辅助变量进行的排序。就是在原来的排序数组中比较和交换的排序。 它是稳定排序
阅读全文
摘要:特点 对于有n个数的数组来说,快速排序最坏情况下的时间复杂度是O(n^2)。但是,快速排序通常是在实际应用中最好的选择,因为它的平均性能非常好: 它的期望时间复杂度是 O(n lgn),而且,O(n lgn)中隐含的常数因子很小。它还是可以进行原址排序。STL algorithm中的sort函数就是
阅读全文
摘要:这里介绍了堆的操作 https://www.cnblogs.com/zuofaqi/p/9665619.html 堆还可以用来做堆排序,其过程是:对于从小到大的排序,使用最大堆。建堆之后,交换第一个元素和最后一个堆元素,这样,最后一个堆元素A[n-1]就是最大值,而A[0...n-2]的堆结构就被破
阅读全文
摘要:表示形式 堆是一个数组,可以被看成是一个近似的完全二叉树。表示堆的数组A包含两个属性:A.length表示元素个数,A.heap-size表示有多少个堆元素存储在数组中。 也就是说,虽然A[1...A.length]可能都存有数据,但是只有A[1...A.heap-size]中存放的是堆的有效元素(
阅读全文
摘要:消息队列是在两个进程间传递二进制数据的方法。每个数据块都有一个类型,接受方可以根据类型来有选择地接受数据,不需要像管道一样必须按照先进先出的顺序。 linux消息队列有四个系统调用:msgget, msgsnd, msgrcv, msgctl msgget 创建/获取一个消息队列。key是唯一键值,
阅读全文
摘要:共享内存是最高效的IPC机制,因为它不涉及进程之间的任何数据传输。这种高效带来的问题是,我们必须用其他手段来同步进程对共享内存的访问,否则会产生竞态条件。所以,共享内存通常和其他进程间通信方式一起使用。 linux 共享内存有四个系统调用:shmget, shmat, shmdt, shmctl s
阅读全文
摘要:ipcs 命令,可以看到当前系统上的共享资源实例 ipcrm 命令,可以删除一个共享资源实例 linux 操作信号量的函数有三个:semget, semop, semctl semget 声明为: key 是一个键值,用来标识一个全局唯一的信号量集。要通过信号量通信的进程需要使用相同的键值来获取该信
阅读全文
摘要:epoll 是 linux 特有的 I/O 复用函数。它是把用户关心的文件描述符事件放在内核的一个事件列表中,故而,无须像select和poll一样每次调用都重复传入文件描述符或事件集。但是, epoll 需要一个额外的文件描述符,来唯一标识内核中的这个事件表。这个文件描述符由 epoll_crea
阅读全文
摘要:相对于select来说,poll 也是在指定时间内论询一定数量的文件描述符,来测试其中是否有就绪的,不过,poll 提供了一个易用的方法,来实现 i/o 复用。 声明如下: 其中,struct pollfd 定义为: fd 为文件描述符,events 告诉poll 监听fd 上哪些事件,它是一系列事
阅读全文
摘要:select 是linux i/o 复用技术之一 man 2 select nfds是监听文件描述符的总数。它通常被设置为select监听的所有文件描述符的最大值加1. readfds, writefds, exceptfds指向可读、可写、异常等事件对应的文件描述符集合。应用程序调用select时
阅读全文
摘要:相对于无名管道来说,socketpair也是使用在亲缘进程之间,不过它提供了能够全双工通信的通道 man socketpair: 该sv保存的两个文件描述符,能写也能读
阅读全文
摘要:特点 无名管道是半双工的,也就是说,一个管道要么只能读,要么只能写 只能在有共同祖先的进程间使用(父子进程、兄弟进程、子孙进程等) fork或者execve调用创建的子进程,继承了父进程的文件描述符 通过man 2 pipe查看 打开两个文件描述符,保存在pipefd中,其中pipefd[0]为读端
阅读全文
摘要:sigaction函数是设置信号处理的接口。比signal函数更健壮 signum指除了SIGKILL 和 SIGSTOP之外,要捕获的信号。struct sigaction *act是要安装的信号。结构题定义为: 其中,sa_handler为信号的处理函数。sa_mask设置在进程原有信号掩码基础
阅读全文
摘要:使用kill -l 命令,可看到linux支持的信号列表: 其中,编号1-31的信号为传统unix支持的信号,是不可靠信号(非实时),编号32-63信号是后来扩充的,为可靠信号(实时信号)。不可靠信号和可靠信号区别是,前者不支持排队,可能会造成信号丢失。后者不会。 1-31 信号释义: 1) SIG
阅读全文
摘要:信号是由用户、系统、进程发给目标进程的信息,以通知目标进程某个状态的改变或者系统异常。linux信号产生条件为: 在终端输入字符,比如ctrl+z 系统异常 系统状态变化。比如 alarm 定时器到期产生SIGALRM信号 运行kill或者调用kill函数 查看Linux支持的信号命令:kill -
阅读全文