C数据结构基础
一些基本数据结构的个人理解,欢迎指正。
- 数组
- 字符串
- 链表
- 树
- 红黑树
- 查找和排序
数组
数组:内存预分配,顺序存储,空间效率差,但是可以在O(1)时间复杂度下实现数据读写,时间效率高。
哈希表:可以利用数组的快速查找来构造哈希表,如下:
1. 把数组下标设置为哈希表的key;
2. 下标对应的内存中存储value;
3. 借此可以实现O(1)的查找;
数组的空间效率低,但是在C++ STL中的动态数组解决了这一弊端<vector>,vector会动态申请分配内存,每次重新分配内存时,为前一次分配的两倍。vector把数据复制到新申请的内存中,再将之前的内存释放,这样虽然提高空间效率,但是频繁的申请释放内存会导致时间效率降低,当我们使用vector时候,应该尽量避免数组容量的变化。
数组和指针的区别:
int data[] = {1, 2, 3, 4, 5};
int *data2 = data;
int size3 = GetSize(data);
printf("size1 is %d.", sizeof(data));
printf("size2 is %d.", sizeof(data2));
printf("size3 is %d.", size3);
上述代码块中,size1 is 20;---->求数组的大小(5 * 4)(5个数字,每个int型占4字节)。
size2 is 4; ---->一个整型指针变量,占4字节。
size3 is 4; ---->当数组作为函数参数进行传递的时候,退化为同类型的指针。
字符串
字符串的初始化:
char str1[] = "hello world";
char str2[] = "hello world";
char* str3 = "hello world";
cahr* str4 = "hello world";
str1 != str2; --->初始化的时候分配的是两块不同的内存,虽然存储的数据相同;
str3 == str4; --->初始化的时候只是初始化一个指针变量,但是数据存储在 常量数据区,为一块内存,因此相等。
在C#中,system.string 操作过程中,原始的字符串不会改变。
system.stringBuilder 若设计多次修改字符串内容,比较推荐这个方法。
链表
待补充。 git仓库地址
树
待补充。
红黑树
待补充。
查找和排序
待补充。