C++必知必会复习(二)

1、什么是Hash表?Hash表的原理是什么?如何解决表中的数据访问冲突?访问它中的元素的平均时间复杂度是什么?

1.1 什么是Hash表?

哈希表(也叫散列表,可以理解为数组+链表),是根据关键码值(Key Value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

1.2 什么是Hash表原理?

把Key通过一个固定的算法函数即所谓的哈希函数转换成一个固定的算法函数。哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当做数组的下标,将value存储在以该数字为下标的数组空间里。

当使用哈希表进行查询时,就是再次使用哈希函数将Key转换对应的数组下标,并定位到该空间获得Value,如此一来,就可以利用数组的定位性能进行数据定位。

::首先在元素的关键字K和元素的位置P之间建立一个对应关系f,使得P=f(K),其中f成为哈希函数。创建哈希表时,把关键字K的元素直接存入地址为f(K)的单元;查找关键字K的元素时利用哈希函数计算出该元素的存储位置P=f(K).
  创建哈希表时,把关键字K的元素直接存入地址为f(K)的单元;查找关键字K的元素时利用哈希函数计算出该元素的存储位置P=f(K).

1.3 如何解决表中的数据访问冲突?

冲突:当关键字集合很大时,关键字值不同的元素可能会映像到哈希表的同一地址上,即K1!=K2,但f(K1)=f(K2),这种现象称为hash冲突,实际中冲突是不可避免的,只能通过改进哈希函数的性能来减少冲突。

解决方法:开放定址发法(再散列法)


2、什么是栈?什么队列?

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

1)栈区(stack)--由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈

2)堆区(heap)--一般由程序员分配释放,若程序不释放,程序结束时可能由OS回收。

3)全局区(静态区)(static)全局变量和静态变量的存储放在一块的。初始化的全局变量和静态变量在一块区域,未初始化全局变量和静态变量在相邻的另一块区域。程序结束时,由系统释放。

4)文字常量区--常量字符串就是放在这里的。程序后由系统释放。

5)程序代码区--存放函数体的二进制代码。


队列:

1)队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(font)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为对头。

2)队列没有元素称为空队列。

3)建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理。一个是队头指针font,它指向队头元素;另一个是队尾指针rear,它指向下一个入队元素的存储元素。

4)队列采用的FIFO,新元素总是被插入到链表的尾部,而读取的时候总是从链表的头部开始读取,每次读取到一个元素,释放一个元素。



猜你喜欢

转载自blog.csdn.net/u014252478/article/details/80191251
今日推荐