对于map来说,背后就是平衡搜索二叉树,具体可见 https://blog.csdn.net/weixin_42513339/article/details/88889306,空间复杂度为 O(logN)
对于unorder_map来说,背后就是哈希,空间复杂度为 O(1),其中O(1)就是类似数组,给与下标就能快速找到。
什么是哈希?
某度定义:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
从生活中看,哈希就是一种算法,哈希把要存储的物体,都变成一个独立不同的数据存储在一个对应的函数映射表上,输入一个数据便能立马找到对应的物体,这个映射表就是哈希表(也叫散列表)。
不同的映射关系,就有不同的哈希函数(也叫散列函数)。
哈希并不是加密算法,他并不是可逆的。
对于算法的衡量有两个,空间复杂度和时间复杂度
时间复杂度
一个算法的空间复杂度只考虑在运行过程中为局部变量分配的存储空间的大小,它包括为参数表中形参变量分配的存储空间和为在函数体中定义的局部变量分配的存储空间两个部分。
举例:
int x=1; while (x <10) { x++; } //空间复杂度为O(1)
arr[0]; //空间复杂度为O(1)
下面的二重循环空间复杂度为O(n^2)
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
;
}
}
空间复杂度
一个程序的空间复杂度是指运行完一个程序所需内存的大小。
(1) 固定部分。这部分空间的大小与输入/输出的数据的个数多少、数值无关。主要包括指令空间(即代码空间)、数据空间(常量、简单变量)等所占的空间。这部分属于静态空间。
(2) 可变空间,这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等。这部分的空间大小与算法有关。一个算法所需的存储空间用f(n)表示。S(n)=O(f(n)) 其中n为问题的规模,S(n)表示空间复杂度。
算法稳定性
举例:某个数组中 a[1]=a[2] = 2;但是排序中,把a[1]和a[2]的值位置换了,虽然结果可能不影响,但是还是算是不稳定。