• 图的定义

图(Graph)是一个顶点(vertex)集合加上一个连接不同顶点对的边(edge)集合。

  • 连通图

如果在图中,从每个顶点到其他每个顶点之间都存在一条路径,则此图为连通图(connected graph)。非连通图包含一些连通分量,它们是最大连通子图(maximal connected subgraph)。
无环连通图称为树,树的集合称为森林。连通图的生成树(spanning tree)是包括该图所有顶点的一个子图,是一颗单一树。图的生成森林是包括该图所有顶点的一个子图,是一个森林。

  • 简单图

一个图如果同时满足下面2个条件:

  1. 没有两条边,它们所关联的两个点都相同(在有向图中,没有两条边的起点终点都分别相同);
  2. 每条边所关联的是两个不同的顶点
    则称为简单图(Simple graph)。

V个顶点的任何无环连通图均有V-1条边(简单图)
V个顶点的图至多有V(V - 1)/2条边。

  • 二分图(Bipartite graph)

二分图(Bipartite graph)指图中的顶点可以分为两个集合,所有边连通一个集合中的顶点与另一个集合中的顶点。

排序算法

  • 插入排序(Insertion Sort)

具体算法描述如下:

  1. 从第一个元素开始,该元素可以认为已经被排序

  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描

  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置

  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置

  5. 将新元素插入到该位置后

重复步骤2~5

平均时间复杂度为$O(N^2)$

C代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
*Insertion sort algorithm
*Time complexity O(N^2)
*@param int a[], the array beening sorted
*@param unsigned int n, number of array
*/
void insertion_sort(int a[], unsigned int n);

void insertion_sort(int a[], unsigned int n) {
unsigned i = 1, j;
for (; i < n; i++) {
int temp = a[i];
for (j = i; j > 0 && a[j-1] > temp; j--) {
a[j] = a[j-1];
}
a[j] = temp;
}
}
  • 希尔排序(Shell Sort)

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。原始的算法实现在最坏的情况下需要进行\(O(n^2)\)的比较和交换。V. Pratt的书对算法进行了少量修改,可以使得性能提升至\(O(nlog^2n)\)。这比最好的比较算法的\(O(nlogn)\)要差一些。

假设有这样一组数[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ],如果我们以步长为5开始进行排序,我们可以通过将这列表放在有5列的表中来更好地描述算法,这样他们就应该看起来是这样:

1
2
3
4
13 14 94 33 82
25 59 94 65 23
45 27 73 25 39
10

然后我们对每列进行排序:

1
2
3
4
10 14 73 25 23
13 27 94 33 39
25 59 94 65 82
45

将上述四行数字,依序接在一起时我们得到:[ 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 ]。这时10已经移至正确位置了,然后再以3为步长进行排序:

1
2
3
4
5
6
10 14 73
25 23 13
27 94 33
39 25 59
94 65 82
45

排序之后变为:

1
2
3
4
5
6
10 14 13
25 23 33
27 25 59
39 65 73
45 94 82
94

最后以1步长进行排序(此时就是简单的插入排序了)。

步长的选择是希尔排序的重要部分。只要最终步长为1任何步长串行都可以工作。算法最开始以一定的步长进行排序。然后会继续以一定步长进行排序,最终算法以步长为1进行排序。当步长为1时,算法变为插入排序,这就保证了数据一定会被排序。
c语言实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void shell_sort(int a[], unsigned int n) {
int gap = 0;
while (gap <= (signed)n)
gap = gap * 3 + 1; //{1, 4, 7, 10, 13, 16...}

while (gap > 0) {
for (int i = gap; i < (signed)n; i++) {
int j = i - gap;
int temp = a[i];
while (j >= 0 && a[j] > temp) {
a[j+gap] = a[j];
j -= gap;
}
a[j+gap] = temp;
}
gap = (gap - 1) / 3;
}
}
  • 堆排序(Heapsort)

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

通常堆是通过一维数组来实现的。在起始数组为 0 的情形中:

父节点i的左子节点在位置 (2i+1);
父节点i的右子节点在位置 (2
i+2);
子节点i的父节点在位置 floor((i-1)/2);

在堆的数据结构中,堆中的最大值总是位于根节点。堆中定义以下几种操作:

  1. 最大堆调整(Max_Heapify):将堆的末端子节点作调整,使得子节点永远小于父节点

  2. 创建最大堆(Build_Max_Heap):将堆所有数据重新排序

  3. 堆排序(HeapSort):移除位在第一个数据的根节点,并做最大堆调整的递归运算

代码来自wikipedia:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;

int parent(int);
int left(int);
int right(int);
void Max_Heapify(int [], int, int);
void Build_Max_Heap(int [], int);
void print(int [], int);
void HeapSort(int [], int);

/*父結點*/
int parent(int i)
{
return (int)floor((i - 1) / 2);
}

/*左子結點*/
int left(int i)
{
return (2 * i + 1);
}

/*右子結點*/
int right(int i)
{
return (2 * i + 2);
}

/*單一子結點最大堆積樹調整*/
void Max_Heapify(int A[], int i, int heap_size)
{
int l = left(i);
int r = right(i);
int largest;
int temp;
if(l < heap_size && A[l] > A[i])
{
largest = l;
}
else
{
largest = i;
}
if(r < heap_size && A[r] > A[largest])
{
largest = r;
}
if(largest != i)
{
temp = A[i];
A[i] = A[largest];
A[largest] = temp;
Max_Heapify(A, largest, heap_size);
}
}

/*建立最大堆積樹*/
void Build_Max_Heap(int A[],int heap_size)
{
for(int i = (heap_size-2)/2; i >= 0; i--)
{
Max_Heapify(A, i, heap_size);
}
}

/*印出樹狀結構*/
void print(int A[], int heap_size)
{
for(int i = 0; i < heap_size;i++)
{
printf("%d ", A[i]);
}
printf("\n");
}

/*堆積排序程序碼*/
void HeapSort(int A[], int heap_size)
{
Build_Max_Heap(A, heap_size);
int temp;
for(int i = heap_size - 1; i >= 0; i--)
{
temp = A[0];
A[0] = A[i];
A[i] = temp;
Max_Heapify(A, 0, i);
}
print(A, heap_size);
}

  • 快速排序

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
步骤为:

  1. 从数列中挑出一个元素,称为 “基准”(pivot)。

  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

快速排序的平均时间复杂度为$O(nlogn)$

实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#ifndef MAX_SIZE
#define MAX_SIZE 1000
#endif

void quicksort(int a[], int low, int high);
void swap(int a[], int i, int j);

void quicksort(int a[], int low, int high) {
if (low < high) {
int i, j, pivot, key;
pivot = (low + high) / 2;
key = a[pivot];
/*put the key in the first*/
swap(a, low, pivot);
i = low + 1;
j = high;
while (i <= j) {
while (i <= high && a[i] <= key) i++;
while (j >= low && a[j] > key) j--;
if (i < j)
swap(a, i, j);
}

swap(a, low, j);
quicksort(a, low, j - 1);
quicksort(a, j + 1, high);
}
}

void swap(int a[], int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}

int main(int argc, char const *argv[])
{
int a[MAX_SIZE] = {INT_MAX};
unsigned int i = 0;
FILE* fp1 = fopen("data1.txt", "wa");
FILE* fp2 = fopen("data2.txt", "wa");

for (; i < MAX_SIZE; i++) {
a[i] = rand();
}

for (i = 0; i < MAX_SIZE; i++) {
fprintf(fp1, "%d\t", a[i]);
}

quicksort(a, 0, MAX_SIZE - 1);

for (i = 0; i < MAX_SIZE; i++) {
fprintf(fp2, "%d\t", a[i]);
}

return 0;
}

这里随机产生1000个数字的数组,然后排序。
data1.txt:

1
41	18467	6334	26500	19169	15724	11478	29358	26962	24464	5705	28145	23281	16827	9961	491	2995	11942	4827	5436	32391	14604	3902	153	292	12382	17421	18716	19718	19895	5447	21726	14771	11538	1869	19912	25667	26299	17035	9894	28703	23811	31322	30333	17673	4664	15141	7711	28253	6868	25547	27644	32662	32757	20037	12859	8723	9741	27529	778	12316	3035	22190	1842	288	30106	9040	8942	19264	22648	27446	23805	15890	6729	24370	15350	15006	31101	24393	3548	19629	12623	24084	19954	18756	11840	4966	7376	13931	26308	16944	32439	24626	11323	5537	21538	16118	2082	22929	16541	4833	31115	4639	29658	22704	9930	13977	2306	31673	22386	5021	28745	26924	19072	6270	5829	26777	15573	5097	16512	23986	13290	9161	18636	22355	24767	23655	15574	4031	12052	27350	1150	16941	21724	13966	3430	31107	30191	18007	11337	15457	12287	27753	10383	14945	8909	32209	9758	24221	18588	6422	24946	27506	13030	16413	29168	900	32591	18762	1655	17410	6359	27624	20537	21548	6483	27595	4041	3602	24350	10291	30836	9374	11020	4596	24021	27348	23199	19668	24484	8281	4734	53	1999	26418	27938	6900	3788	18127	467	3728	14893	24648	22483	17807	2421	14310	6617	22813	9514	14309	7616	18935	17451	20600	5249	16519	31556	22798	30303	6224	11008	5844	32609	14989	32702	3195	20485	3093	14343	30523	1587	29314	9503	7448	25200	13458	6618	20580	19796	14798	15281	19589	20798	28009	27157	20472	23622	18538	12292	6038	24179	18190	29657	7958	6191	19815	22888	19156	11511	16202	2634	24272	20055	20328	22646	26362	4886	18875	28433	29869	20142	23844	1416	21881	31998	10322	18651	10021	5699	3557	28476	27892	24389	5075	10712	2600	2510	21003	26869	17861	14688	13401	9789	15255	16423	5002	10585	24182	10285	27088	31426	28617	23757	9832	30932	4169	2154	25721	17189	19976	31329	2368	28692	21425	10555	3434	16549	7441	9512	30145	18060	21718	3753	16139	12423	16279	25996	16687	12529	22549	17437	19866	12949	193	23195	3297	20416	28286	16105	24488	16282	12455	25734	18114	11701	31316	20671	5786	12263	4313	24355	31185	20053	912	10808	1832	20945	4313	27756	28321	19558	23646	27982	481	4144	23196	20222	7129	2161	5535	20450	11173	10466	12044	21659	26292	26439	17253	20024	26154	29510	4745	20649	13186	8313	4474	28022	2168	14018	18787	9905	17958	7391	10202	3625	26477	4414	9314	25824	29334	25874	24372	20159	11833	28070	7487	28297	7518	8177	17773	32270	1763	2668	17192	13985	3102	8480	29213	7627	4802	4099	30527	2625	1543	1924	11023	29972	13061	14181	31003	27432	17505	27593	22725	13031	8492	142	17222	31286	13064	7900	19187	8360	22413	30974	14270	29170	235	30833	19711	25760	18896	4667	7285	12550	140	13694	2695	21624	28019	2125	26576	21694	22658	26302	17371	22466	4678	22593	23851	25484	1018	28464	21119	23152	2800	18087	31060	1926	9010	4757	32170	20315	9576	30227	12043	22758	7164	5109	7882	17086	29565	3487	29577	14474	2625	25627	5629	31928	25423	28520	6902	14962	123	24596	3737	13261	10195	32525	1264	8260	6202	8116	5030	20326	29011	30771	6411	25547	21153	21520	29790	14924	30188	21763	4940	20851	18662	13829	30900	17713	18958	17578	8365	13007	11477	1200	26058	6439	2303	12760	19357	2324	6477	5108	21113	14887	19801	22850	14460	22428	12993	27384	19405	6540	31111	28704	12835	32356	6072	29350	18823	14485	20556	23216	1626	9357	8526	13357	29337	23271	23869	29361	12896	13022	29617	10112	12717	18696	11585	24041	24423	24129	24229	4565	6559	8932	22296	29855	12053	16962	3584	29734	6654	16972	21457	14369	22532	2963	2607	2483	911	11635	10067	22848	4675	12938	2223	22142	23754	6511	22741	20175	21459	17825	3221	17870	1626	31934	15205	31783	23850	17398	22279	22701	12193	12734	1637	26534	5556	1993	10176	25705	6962	10548	15881	300	14413	16641	19855	24855	13142	11462	27611	30877	20424	32678	1752	18443	28296	12673	10040	9313	875	20072	12818	610	1017	14932	28112	30695	13169	23831	20040	26488	28685	19090	19497	2589	25990	15145	19353	19314	18651	26740	22044	11258	335	8759	11192	7605	25264	12181	28503	3829	23775	20608	29292	5997	17549	29556	25561	31627	6467	29541	26129	31240	27813	29174	20601	6077	20215	8683	8213	23992	25824	5601	23392	15759	2670	26428	28027	4084	10075	18786	15498	24970	6287	23847	32604	503	21221	22663	5706	2363	9010	22171	27489	18240	12164	25542	7619	20913	7591	6704	31818	9232	750	25205	4975	1539	303	11422	21098	11247	13584	13648	2971	17864	22913	11075	21545	28712	17546	18678	1769	15262	8519	13985	28289	15944	2865	18540	23245	25508	28318	27870	9601	28323	21132	24472	27152	25087	28570	29763	29901	17103	14423	3527	11600	26969	14015	5565	28	21543	25347	2088	2943	12637	22409	26463	5049	4681	1588	11342	608	32060	21221	1758	29954	20888	14146	690	7949	12843	21430	25620	748	27067	4536	20783	18035	32226	15185	7038	9853	25629	11224	15748	19923	3359	32257	24766	4944	14955	23318	32726	25411	21025	20355	31001	22549	9496	18584	9515	17964	23342	8075	17913	16142	31196	21948	25072	20426	14606	26173	24429	32404	6705	20626	29812	19375	30093	16565	16036	14736	29141	30814	5994	8256	6652	23936	30838	20482	1355	21015	1131	18230	17841	14625	2011	32637	4186	19690	1650	5662	21634	10893	10353	21416	13452	14008	7262	22233	5454	16303	16634	26303	14256	148	11124	12317	4213	27109	24028	29200	21080	21318	16858	24050	24155	31361	15264	11903	3676	29643	26909	14902	3561	28489	24948	1282	13653	30674	2220	5402	6923	3831	19369	3878	20259	19008	22619	23971	30003	21945	9781	26504	12392	32685	25313	6698	5589	12722	5938	19037	6410	31461	6234	12508	9961	3959	6493	1515	25269	24937	28869	58	14700	13971	26264	15117	16215	24555	7815	18330	3039	30212	29288	28082	1954	16085	20710	24484	24774	8380	29815	25951	6541	18115	1679	17110	25898	23073	788	23977	18132	29956	28689	26113	10008	12941	15790	1723	21363	28	25184	24778	7200	5071	1885	21974	1071	11333	22867	26153	14295	32168	20825	9676	15629	28650	2598	3309	4693	4686	30080	10116	12249

data2.txt:

1
28	28	41	53	58	123	140	142	148	153	193	235	288	292	300	303	335	467	481	491	503	608	610	690	748	750	778	788	875	900	911	912	1017	1018	1071	1131	1150	1200	1264	1282	1355	1416	1515	1539	1543	1587	1588	1626	1626	1637	1650	1655	1679	1723	1752	1758	1763	1769	1832	1842	1869	1885	1924	1926	1954	1993	1999	2011	2082	2088	2125	2154	2161	2168	2220	2223	2303	2306	2324	2363	2368	2421	2483	2510	2589	2598	2600	2607	2625	2625	2634	2668	2670	2695	2800	2865	2943	2963	2971	2995	3035	3039	3093	3102	3195	3221	3297	3309	3359	3430	3434	3487	3527	3548	3557	3561	3584	3602	3625	3676	3728	3737	3753	3788	3829	3831	3878	3902	3959	4031	4041	4084	4099	4144	4169	4186	4213	4313	4313	4414	4474	4536	4565	4596	4639	4664	4667	4675	4678	4681	4686	4693	4734	4745	4757	4802	4827	4833	4886	4940	4944	4966	4975	5002	5021	5030	5049	5071	5075	5097	5108	5109	5249	5402	5436	5447	5454	5535	5537	5556	5565	5589	5601	5629	5662	5699	5705	5706	5786	5829	5844	5938	5994	5997	6038	6072	6077	6191	6202	6224	6234	6270	6287	6334	6359	6410	6411	6422	6439	6467	6477	6483	6493	6511	6540	6541	6559	6617	6618	6652	6654	6698	6704	6705	6729	6868	6900	6902	6923	6962	7038	7129	7164	7200	7262	7285	7376	7391	7441	7448	7487	7518	7591	7605	7616	7619	7627	7711	7815	7882	7900	7949	7958	8075	8116	8177	8213	8256	8260	8281	8313	8360	8365	8380	8480	8492	8519	8526	8683	8723	8759	8909	8932	8942	9010	9010	9040	9161	9232	9313	9314	9357	9374	9496	9503	9512	9514	9515	9576	9601	9676	9741	9758	9781	9789	9832	9853	9894	9905	9930	9961	9961	10008	10021	10040	10067	10075	10112	10116	10176	10195	10202	10285	10291	10322	10353	10383	10466	10548	10555	10585	10712	10808	10893	11008	11020	11023	11075	11124	11173	11192	11224	11247	11258	11323	11333	11337	11342	11422	11462	11477	11478	11511	11538	11585	11600	11635	11701	11833	11840	11903	11942	12043	12044	12052	12053	12164	12181	12193	12249	12263	12287	12292	12316	12317	12382	12392	12423	12455	12508	12529	12550	12623	12637	12673	12717	12722	12734	12760	12818	12835	12843	12859	12896	12938	12941	12949	12993	13007	13022	13030	13031	13061	13064	13142	13169	13186	13261	13290	13357	13401	13452	13458	13584	13648	13653	13694	13829	13931	13966	13971	13977	13985	13985	14008	14015	14018	14146	14181	14256	14270	14295	14309	14310	14343	14369	14413	14423	14460	14474	14485	14604	14606	14625	14688	14700	14736	14771	14798	14887	14893	14902	14924	14932	14945	14955	14962	14989	15006	15117	15141	15145	15185	15205	15255	15262	15264	15281	15350	15457	15498	15573	15574	15629	15724	15748	15759	15790	15881	15890	15944	16036	16085	16105	16118	16139	16142	16202	16215	16279	16282	16303	16413	16423	16512	16519	16541	16549	16565	16634	16641	16687	16827	16858	16941	16944	16962	16972	17035	17086	17103	17110	17189	17192	17222	17253	17371	17398	17410	17421	17437	17451	17505	17546	17549	17578	17673	17713	17773	17807	17825	17841	17861	17864	17870	17913	17958	17964	18007	18035	18060	18087	18114	18115	18127	18132	18190	18230	18240	18330	18443	18467	18538	18540	18584	18588	18636	18651	18651	18662	18678	18696	18716	18756	18762	18786	18787	18823	18875	18896	18935	18958	19008	19037	19072	19090	19156	19169	19187	19264	19314	19353	19357	19369	19375	19405	19497	19558	19589	19629	19668	19690	19711	19718	19796	19801	19815	19855	19866	19895	19912	19923	19954	19976	20024	20037	20040	20053	20055	20072	20142	20159	20175	20215	20222	20259	20315	20326	20328	20355	20416	20424	20426	20450	20472	20482	20485	20537	20556	20580	20600	20601	20608	20626	20649	20671	20710	20783	20798	20825	20851	20888	20913	20945	21003	21015	21025	21080	21098	21113	21119	21132	21153	21221	21221	21318	21363	21416	21425	21430	21457	21459	21520	21538	21543	21545	21548	21624	21634	21659	21694	21718	21724	21726	21763	21881	21945	21948	21974	22044	22142	22171	22190	22233	22279	22296	22355	22386	22409	22413	22428	22466	22483	22532	22549	22549	22593	22619	22646	22648	22658	22663	22701	22704	22725	22741	22758	22798	22813	22848	22850	22867	22888	22913	22929	23073	23152	23195	23196	23199	23216	23245	23271	23281	23318	23342	23392	23622	23646	23655	23754	23757	23775	23805	23811	23831	23844	23847	23850	23851	23869	23936	23971	23977	23986	23992	24021	24028	24041	24050	24084	24129	24155	24179	24182	24221	24229	24272	24350	24355	24370	24372	24389	24393	24423	24429	24464	24472	24484	24484	24488	24555	24596	24626	24648	24766	24767	24774	24778	24855	24937	24946	24948	24970	25072	25087	25184	25200	25205	25264	25269	25313	25347	25411	25423	25484	25508	25542	25547	25547	25561	25620	25627	25629	25667	25705	25721	25734	25760	25824	25824	25874	25898	25951	25990	25996	26058	26113	26129	26153	26154	26173	26264	26292	26299	26302	26303	26308	26362	26418	26428	26439	26463	26477	26488	26500	26504	26534	26576	26740	26777	26869	26909	26924	26962	26969	27067	27088	27109	27152	27157	27348	27350	27384	27432	27446	27489	27506	27529	27593	27595	27611	27624	27644	27753	27756	27813	27870	27892	27938	27982	28009	28019	28022	28027	28070	28082	28112	28145	28253	28286	28289	28296	28297	28318	28321	28323	28433	28464	28476	28489	28503	28520	28570	28617	28650	28685	28689	28692	28703	28704	28712	28745	28869	29011	29141	29168	29170	29174	29200	29213	29288	29292	29314	29334	29337	29350	29358	29361	29510	29541	29556	29565	29577	29617	29643	29657	29658	29734	29763	29790	29812	29815	29855	29869	29901	29954	29956	29972	30003	30080	30093	30106	30145	30188	30191	30212	30227	30303	30333	30523	30527	30674	30695	30771	30814	30833	30836	30838	30877	30900	30932	30974	31001	31003	31060	31101	31107	31111	31115	31185	31196	31240	31286	31316	31322	31329	31361	31426	31461	31556	31627	31673	31783	31818	31928	31934	31998	32060	32168	32170	32209	32226	32257	32270	32356	32391	32404	32439	32525	32591	32604	32609	32637	32662	32678	32685	32702	32726	32757

Computer Systems A Programmer's Perspective读书笔记

2的补码表示为:
$$B2T_w(x) = -x_{w-1}2^{w-1} + \sum_{i=0}^{w-2} x_i2^i$$
其中,w表示字长。

将有符号数x转换为无符号数:
$$
T2U_w(x) =
\begin{cases}
x + 2^w, & x < 0\
x, & x \ge 0
\end{cases}
$$

将无符号数u转换为有符号数:
$$
U2T_w(u) =
\begin{cases}
u, & u < 2^{w-1}\
u - 2^w, & u \ge 2^{w-1}
\end{cases}
$$

计算机中浮点数的表示:
根据国际标准IEEE 754,任意一个二进制浮点数V可以表示成下面的形式:
$$
V = (-1)^s \times M \times 2^E
$$

(1)\((-1)^s\)表示符号位,当s=0,V为正数;当s=1,V为负数。
(2)M表示有效数字,大于等于1,小于2。
(3)\(2^E\)表示指数位。

举例来说,十进制的5.0,写成二进制是101.0,相当于1.01×2^2。那么,按照上面V的格式,可以得出s=0,M=1.01,E=2。
十进制的-5.0,写成二进制是-101.0,相当于-1.01×2^2。那么,s=1,M=1.01,E=2。

IEEE 754规定,对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。

对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。

IEEE 754对有效数字M和指数E,还有一些特别规定。
前面说过,1≤M<2,也就是说,M可以写成1.xxxxxx的形式,其中xxxxxx表示小数部分。IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。

至于指数E,情况就比较复杂。

首先,E为一个无符号整数(unsigned int)。这意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,E的真实值必须再减去一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。
比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。

然后,指数E还可以再分成三种情况:

(1)E不全为0或不全为1。这时,浮点数就采用上面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。

(2)E全为0。这时,浮点数的指数E等于1-127(或者1-1023),有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0(当尾数是0),以及接近于0的很小的数字(尾数不为0)。

(3)E全为1。这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);如果有效数字M不全为0,表示这个数不是一个数(NaN)。

一个由C/C++编译的程序占用的内存分为以下几个部分:

1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局区(静态区)(static),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后由系统释放。
4、文字常量区—常量字符串就是放在这里的。程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//main.cpp
int a = 0; //全局初始化区
char *p1; //全局未初始化区

main()
{
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //123456\\0在常量区,p3在栈上。
static int c =0;//全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); //123456\\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}

c语言指针加1

C语言中,指针变量存储的是地址,那么我们不禁要问:将指针变量加1,那么地址变为多少?
比如某个指针变量p的值为0x8989f580,p + 1的值是多少?

这就要看指针指向的变量类型了,假设int型占32位(4个字节),p是指向int型的指针,p + 1实际上是加4;如果是char型,那么p + 1实际上是加1(因为char型占1个字节)。所以总结为:p + 1 == p + sizeof(p指向的类型)。

这里还有考虑一个特殊情况,那就是void*指针,如果p是void *指针,那么p + 1还是将地址值加1,而sizeof(void *)却是4。下面例子可以说明:

1
2
3
4
5
6
7
int main(int argc, char const *argv[])
{
void *p;
printf("%x\n", p);
printf("%x\n", p + 1);
printf("%d\n", sizeof(void *));
}

输出结果为:

895f0230
895f0231
4

我们知道malloc()calloc()函数返回的都是void*指针,将其赋值给某个指针变量时会自动进行类型转换,所以不会出现指针不匹配的问题。

正则表达式语法
















































































































































































字符 描述
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,「n」匹配字符「n」。「\n」匹配一个换行符。序列「\」匹配「\」而「(」则匹配「(」。
^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配「\n」或「\r」之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配「\n」或「\r」之前的位置。
匹配前面的子表达式零次或多次。例如,zo能匹配「z」以及「zoo」。等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,「zo+」能匹配「zo」以及「zoo」,但不能匹配「z」。+等价于{1,}。
? 匹配前面的子表达式零次或一次。例如,「do(es)?」可以匹配「do」或「does」中的「do」。?等价于{0,1}。
{n} n是一个非负整数。匹配确定的n次。例如,「o{2}」不能匹配「Bob」中的「o」,但是能匹配「food」中的两个o。
{n,} n是一个非负整数。至少匹配n次。例如,「o{2,}」不能匹配「Bob」中的「o」,但能匹配「foooood」中的所有o。「o{1,}」等价于「o+」。「o{0,}」则等价于「o」。
{n,m} mn均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,「o{1,3}」将匹配「fooooood」中的前三个o。「o{0,1}」等价于「o?」。请注意在逗号和两个数之间不能有空格。
? 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串「oooo」,「o+?」将匹配单个「o」,而「o+」将匹配所有「o」。
. 匹配除「\n」之外的任何单个字符。要匹配包括「\n」在内的任何字符,请使用像「(.|\n)」的模式。
(pattern) 匹配pattern并获取这一匹配的子字符串。该子字符串用于向后引用。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括號字符,请使用「(」或「)」。
(?:pattern) 匹配pattern但不获取匹配的子字符串,也就是说这是一个非获取匹配,不存储匹配的子字符串用于向后引用。这在使用或字符「(|)」来组合一个模式的各个部分是很有用。例如「industr(?:y|ies)」就是一个比「industry|industries」更简略的表达式。
(?=pattern) 正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,「Windows(?=95|98|NT|2000)」能匹配「Windows2000」中的「Windows」,但不能匹配「Windows3.1」中的「Windows」。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern) 正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如「Windows(?!95|98|NT|2000)」能匹配「Windows3.1」中的「Windows」,但不能匹配「Windows2000」中的「Windows」。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
(?<=pattern) 反向肯定预查,与正向肯定预查类似,只是方向相反。例如,「(?<=95|98|NT|2000)Windows」能匹配「2000Windows」中的「Windows」,但不能匹配「3.1Windows」中的「Windows」。
(?<!pattern) 反向否定预查,与正向否定预查类似,只是方向相反。例如「(?<!95|98|NT|2000)Windows」能匹配「3.1Windows」中的「Windows」,但不能匹配「2000Windows」中的「Windows」。
x|y 匹配x或y。例如,「z|food」能匹配「z」或「food」。「(z|f)ood」则匹配「zood」或「food」。
[xyz] 字符集合(character class)。匹配所包含的任意一个字符。例如,「[abc]」可以匹配「plain」中的「a」。特殊字符仅有反斜线 \ 保持特殊含义,用于转义字符。其它特殊字符如星号、加号、各种括号等均作为普通字符。脱字符 ^ 如果出现在首位则表示负值字符集合;如果出现在字符串中间就仅作为普通字符。连字符 - 如果出现在字符串中间表示字符范围描述;如果如果出现在首位则仅作为普通字符。
[^xyz] 排除型(negate)字符集合。匹配未列出的任意字符。例如,「[^abc]」可以匹配「plain」中的「plin」。
[a-z] 字符范围。匹配指定范围内的任意字符。例如,「[a-z]」可以匹配「a」到「z」范围内的任意小写字母字符。
[^a-z] 排除型的字符范围。匹配任何不在指定范围内的任意字符。例如,「[^a-z]」可以匹配任何不在「a」到「z」范围内的任意字符。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如,「er\b」可以匹配「never」中的「er」,但不能匹配「verb」中的「er」。
\B 匹配非单词边界。「er\B」能匹配「verb」中的「er」,但不能匹配「never」中的「er」。
\cx 匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的「c」字符。
\d 匹配一个数字字符。等价于[0-9]。
\D 匹配一个非数字字符。等价于[^0-9]。
\f 匹配一个换页符。等价于\x0c和\cL。
\n 匹配一个换行符。等价于\x0a和\cJ。
\r 匹配一个回车符。等价于\x0d和\cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于[^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于\x09和\cI。
\v 匹配一个垂直制表符。等价于\x0b和\cK。
\w 匹配包括下划线的任何单词字符。等价于「[A-Za-z0-9_]」。
\W 匹配任何非单词字符。等价于「[^A-Za-z0-9_]」。
\xn 匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,「\x41」匹配「A」。「\x041」则等价于「\x04&1」。正則表达式中可以使用ASCII编码。.
\num 向后引用(back-reference)一个子字符串(substring),该子字符串与正则表达式的第num个用括号围起来的子表达式(subexpression)匹配。其中num是从1开始的正整数,其上限可能是99。例如:「(.)\1」匹配两个连续的相同字符。
\n 标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。
\nm 标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若nm均为八进制数字(0-7),则\nm将匹配八进制转义值nm
\nml 如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。
\un 匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号(©)。