思路

本题是考察栈和队列的常见问题。要解答本题必须知道栈的队列的基本原理。

栈:一种后进先出的数据结构,想象一个单车道,汽车一辆接一辆往里开,最先进入的在最里面,最后进入的在最外面,当需要出去的时候,最后进入的先出,最先进入的最后出去。符合类似进出原则的数据结构就叫做栈。 往栈中存入数据也叫压栈,取出数据也叫弹栈。

队列:先进先出的数据结构。顾名思义,就像排队一样,最先进入在队头,后进入在队尾,队头先出队,队尾后出队。往队列中存入数据叫入队,往队列中取数据叫出队。

阅读全文 »

快速幂算法

看了不少题解,都讲的太复杂,而本人一直崇尚大道至简,于是萌生出写该题解的想法。

快速幂算法可以在 O(lgn) 内完一个数的 n 次幂计算,即实现C语言库函数 double pow(double x, double y)

阅读全文 »

C 语言使用 malloc 分配内存,使用 free 释放内存。那么它们是怎么实现的呢?

堆内存位于数据段(data) 和内存映射区之间,它有一个堆顶指针 brk,malloc 将堆内存分为空闲块和已分配块,使用链表来管理空闲块和已分配块。当堆内存用完时,使用系统调用 sbrk 增大 brk 来增大堆内存的大小。当要求分配的内存大小大于空闲块时,就将空闲块分成两份,一份分配给用户,剩下的内存作为一个空闲块。

阅读全文 »

对于像 maclloc 这样的显式分配器,应用通过调用 malloc 和 free 来分配和释放堆块,应用要负责释放所有不再需要的已分配块。

不能及时释放内存堆块可能造成严重的内存错误,例如:内存泄漏,如下列代码所示:

阅读全文 »

Linux 为每个进程维护一个单独的虚拟地址空间,如下图所示。

  • 内核虚拟内存包含内核中的代码和数据结构。
  • 内核虚拟内存的某些区域被映射到所有进程共享的物理页面,例如每个进程都共享内核的代码和全局数据结构。
  • Linux 也将一组连续的虚拟页面(大小等于系统中 DRAM 的总量)映射到相应的一组连续的物理页面。例如:访问页表,或对设备执行IO操作,这些设备被映射到特定物理内存位置时。
  • 内核虚拟内存的其它区域包含每个进程的独有数据,例如页表,内核在进程的上下文中执行代码时使用的栈,以及记录虚拟地址空间当前组织的各种数据结构。
阅读全文 »

9.1 物理地址和虚拟地址

计算机系统的主存是由 M 个连续的字节大小的单元组成的数组。每个字节都有一个唯一的物理地址,地址范围从 0 到 M-1。计算机使用内存最自然的方式是使用物理地址,我们将这种方式称为物理寻址。

CPU 向内存发送一个地址,内存将该地址开始的四个字节信息传送到 CPU 中的一个 4字节寄存器。

阅读全文 »

快速排序的变种——快速选择算法

给出一个数组,例如[1,4,2,6,8,3],现在要求出第 k 大的数字,即将数组从大到小排列,选择第k个数。用什么算法更快找到这个数?

最容易想到的就是先将数组排序,就可以很容易找到第 k 大的数字。就算用快速排序,时间复杂度为 O(nlgn)。有没有更快的算法?

阅读全文 »
0%