力扣之路-题库1

知识点:

哈希表,时间复杂度,空间复杂度

待解决问题:

1.常见stl时间复杂度

2.有序查询和无序查询应用那些容器

3.常见stl特点和适用场景

4.map和hashmap区别

5.有序容器选择,无序容器选择

概念解答:

哈希表:根据关键码的值而直接进行访问的数据结构。

当遇到要快速判断一个元素是否出现集合里的时候,就要考虑哈希法,但哈希法也是牺牲空间换取了时间,因为我们要使用额外的数组,存放数据,才能实现快速查找。要枚举的话时间复杂度是O(n),而哈希表只需要O(1)就可以做到。

算法的效率:虽然计算机能快速的完成运算处理,但实际上,它也需要根据 输入数据的大小和算法效率来消耗一定的处理器资源,要想编写出高效运行的程序,我们需要考虑到算法的效率,算法的效率主要从时间复杂度和空间复杂度进行评估。

时间频度:一个算法中的语句执行次数称为语句频度或时间频度,T(n)

时间复杂度:一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,称f(n)是T(n)的同数量级函数,记作T(n) = O(f(n)),称O(f(n))为算法的渐进时间渐进时间复杂度,简称时间复杂度,时间频度不同但时间复杂度可能相同

T(n) = n^2 +3n+4与 T(n) = 4n^2+2n+1,时间频度不同,时间复杂度相同O(n^2).

常见的时间复杂度:常数阶O(1) < 对数阶O(log2n)< 线性阶(O(n))< 线性对数阶(O(nlog2n)) < 平方阶O(n^2) < 方阶O(n^3) < k次方阶O(n^k)< 指数阶O(2^n) < O(n!) < O(n^n)

空间复杂度:对一个算法在运行过程中临时占用储存空间大小的一个量度,S(n). 储存空间与数据规模之间的增长关系。

程序执行时所需储存空间包括两个部分:

a.固定部分:这部分空间的大小与输入、输出的数据的个数多少、数值无关。主要包括指令空间(代码空间)、数据空间(常亮、简单变量)等所占的空间。这部分属于静态空间。

b.可变空间:这部分空间主要包括动态分配的空间,以及递归栈所需的空间等,这部分空间大小与算法有关。

空间复杂度为O(1):有的算法只需要占用少量的临时工作单元,而且不随问题规模的大小 而改变,我们称这种算法是就地执行的,是节省储存的算法

空间复杂度为O(n):有的算法需要占用的临时工作单元与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的储存单元,例如快速排序和归并排序算法就属于这种情况。

问题解答:

参考:C++ STL容器时间复杂度下的最佳选择_louie_chen的博客-CSDN博客_c++容器时间复杂度

5.有序容器选择,关联容器选择

有序容器包括:vector、deque、list 

vector:高效的随机访问和高效向尾部加入新元素。向量容器一般实现为一个动态分配的数组,向量中的元素连续地存放在这个数组中,因此对此向量进行随机访问时具有和动态数组几乎一样的效率。向量容器在每次扩展空间时, 实际分配的空间一般大于所需的空间,另一方面,将已有元素从向量容器中删除时,多出的闲置空间并不会被释放,因为再插入新的元素时可能会重新占用这些空间,因此,向量容器对象已分配的空间所能容纳元素个数常常会大于容器中实际元素的个数,于是称已分配的空间所能容纳的元素个数称为容器的容量,用capacity()获取,容器中实际元素的个数叫容器的大小,用size()获取。

使用风险点:

        1.插入新元素时,插入位置之后的元素都要被顺序向后移动,总体插入效率不高。

        2.插入位置越靠前,执行插入所需要的时间就越多(尾部插入效率还是比较高)。

        3.如果插入引起容量扩展,那么执行之前所获得的一切迭代器和指向向量元素的指针、引用都会失效,因为空间重新分配,元素的内存地址发生了变化。

        4.如果插入元素没有引起扩展,只有处于插入位置之后的迭代器和指针、引用会失效。

可以通过reserve(),在插入之前使用,确保这部分空间被分配,避免在插入过程中多次重新分配空间。

deque:支持向两端高效的插入数据、支持随机访问容器。

list:不能随机访问但可以高效在任意位置插入和删除元素的容器。

关联容器:map、set、multimap、multiset、unorder_set、unorder_map

map:储存的是无重复键值的元素对,而multimap允许相同的键值重复出现,即一个键值可以对应多个值。

特点:map内部自建了一颗红黑树,可以对数据进行自动排序,所以map里的数据都是有序的。所有元素都是键值存在,不允许重复,所有元素是通过键进行自动排序的,map的键是不能修改的,但是其键对应的值是可以修改的。查询、插入、删除操作的时间复杂度都是O(logn)

multimap:相同的键可以出现多次的,不支持[]操作符。

set: 底层红黑树,set中每一个元素的值都是唯一的,而且系统能根据元素的值自动进行排序。

特点:set的元素都是排序好的;set中的元素都是唯一的,没有重复。

multiset:允许元素重复

map和unordered_map:

           ·运行效率:unordered_map最高,map效率较低但提供了稳定效率和有序的序列

           ·占用内存:map内存占用略低,unordered_map内存占用略高,而且是线性成比例的

2022_09_28

添加map::find()用法:

iterator map_name.find(key)
        or 
constant iterator map_name.find(key)

参数:该函数接受一个强制性参数键,该键指定要在Map容器中搜索的键。

返回值:该函数返回一个迭代器或常量迭代器,该迭代器或常量迭代器引用键在映射中的位置。如果映射容器中不存在该键,则它返回引用map.end()的迭代器或常量迭代器。

例子:

int main() {       

 // initialize container    

 multimap<int, int> mp1;       

 // insert elements in random order    

 mp1.insert({ 2, 30 });    

 mp1.insert({ 1, 40 });     

 mp1.insert({ 4, 50 });        

cout << "The elements from position 3 in map are : \n";    

for (auto it = mp1.find(3); it != mp.end(); it++)        

 cout << it->first              << '\t' << it->second << '\n';     

//it->first map中的key    it->second map中的vlue  

 return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值