4月19日map和multimap以及AVL树的学习

发布时间 2023-04-19 23:17:53作者: 玄灵镜

map的插入比较繁琐,但是用方括号运算符就可以直接插入。也可以用方括号查找键的位置并且用它的返回值来修改值。同样map也可以用迭代器来遍历。map头文件中还有一个multimap关键字,他与map不同点在于它可以存入键相同的键值对,以应对某些情况。

给定一个单词列表 words 和一个整数 k ,返回前 k 个出现次数最多的单词。

返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率, 按字典顺序 排序。

 

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/top-k-frequent-words
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

这道题若是用到map就很容易,解题思路是先将vector中所有数据入到map中统计出每个单词的数量,然后再将键值对中的值由大到小排好序,依次放入新定义的vector中。但是若重新排序就会打乱一些已经按字典排好的且出现次数相同的单词,因为快排的底层是不稳定的。

所以这里复习一下各种排序(升序)的稳定性问题:

1:冒泡排序:冒泡排序是通过不断比较相邻的元素,将大数不断地冒泡向后面,假如两个元素相等,就不会进行交换,若不相邻,在冒泡完了后相同的元素次序也不会发生改变。所以他是稳定的

2:选择排序:选择排序是通过选取第一个数,与后面的数不断比较,遇到小的与之交换,所以前面的数再进行交换时可能交换到后面去,所以选择排序不是一个稳定的排序。

3:插入排序:插入排序是从数据的第一个开始,不断地将后面的数一个一个放在前n个数的有序序列中,因为是从前往后选择且从后往前插入的,所以相同的两个数,后面的也不会插到前面去,所以插入排序是一个稳定的排序。

4:希尔排序;希尔排序是插入排序的变形,他能更快的将大的数放在后面,将小的数放在前面。但是在排序的过程中相同的数可能被不同的分割导致分离交换,所以他不是一个稳定的排序。

5:堆排序:堆排序是通过建堆后,不断将堆顶的元素与堆尾元素交换,然后前n-1个元素向下调整,进行排序的,有可能相邻的相同元素,被不同的双亲调走导致顺序被打乱,所以堆排序也不是一个稳定的排序。

6:归并排序:归并排序的底层是通过不断分割和合并两个有序数组完成的,当两个相同元素合并时,前面的还在前面,后面的还在后面。所以归并排序是稳定的排序。

7:快速排序:快速排序有三种方式,但是思路都是将特定元素放在他应有的位置,步骤是选取一个key,然后从数组的两端开始前面找到比key大的后面找到比key小的交换,不断如此当前后指针相遇时,比key大的都放在了相遇位置的后面比key小的都放在了相遇位置的前面,再将key放在相遇位置,那么key的位置就对了在循环进入key的左区间和右区间,不断排序,直到完成。因为若有相同的数据则这个数据的合适位置就有两个,不能保证前面的树就能一定放在前面,所以快排不是一个稳定的排序。

言归正传,因为快排可能会破坏map的中键的字典序列,所以不能用快排,这时multimap就派上用场了,将map中的数全部入到multimap类型的sortmap中,对于相同的数据,他不会破坏已有的顺序,所以只需要降序出前k个sortmap中的数据放入定义的vector中即可。

代码图: