外部排序

一般讨论的排序都是内部排序,所谓外部和内部,是针对排序时的条件而言的,内部指所有的数据都可以直接拿到,而外部就是每次只能拿到一部分数据,最典型的现实场景

  • 对数组进行排序,整个数组当然都是在内存里的,可以直接拿到
  • 而对磁盘数据(比如文件)进行排序,要先把数据读进内存,而且限于内存的大小,内存中在某一时刻只能有一部分数据

外部排序的限制在于从磁盘读数据是一件很麻烦的事情,因为在磁盘上的数据存储并不是和在内存中那样是连续的,有个地址就可以直接访问,而是分散的,而且每次找一个数据都得寻道,旋转,再数据传输,排序的结果还得再写回磁盘,实际磁盘I/O的时间会远超在内存上操作的时间,所以要尽可能减少对磁盘的访问,I/O次数也成为外部排序时主要考虑的代价

这时候可以选什么排序算法来进行外部排序呢,很明显,选择排序,冒泡排序,这种每一趟都得把数据基本过一遍的算法是不行的,实际上可以想到,归并排序是个不错的选择

例如,一个有2000个记录的文件,每个磁盘块可以容纳125个记录,首先通过8次内部排序得到8个初始归并段R1到R8,每个段有250个记录,然后对该文件做两两归并,直至得到一个有序的文件

把内存分出三个缓冲区,两个输入一个输出,从R1和R2分别读一个磁盘块到输入缓冲区,归并到输出缓冲区,钥匙其中一个缓冲区空了就再读一个,然后把输出写到磁盘,再归并R3和R4,R5和R6,R7和R8,分别得到R1’-R4'

最小生成树

How does it run?

  • Choose an arbitrary vertex and let
  • Choose a vertex closest to and add it into and record the corresponding edge
  • go on until all vertices are in
  • The recorded edges and constructs a Minimum Spanning Tree

Let be a weithted connected graph and has vertices.

socket in C

一些常用的函数:

c

int socket(int domain, int type, int protocol);

domain可选值:

关于代数基本定理

任一次数 的复多项式在复数域中至少有一个根。

代数基本定理的第一个实质性证明是由 Gauss 在他的博士论文中给出的。

,那么 有一次因式,设为 ,令 中是 重因式,则 ,令

Test

This is bold text, and this is emphasized text.

This is an inline equation:

This is a display equation: