c++ - 哪种数据结构更适合 - 堆或排序数组?
问题描述
我有一个程序:
将一些数据从磁盘加载到
std::map
内存中。std::map
保持数据排序。将排序后的数据保存到磁盘
我想知道如果我这样做堆是否会更快:
将一些数据从磁盘加载到
std::vector
内存中。对向量进行排序
将数据保存到磁盘
甚至使用堆:
将一些数据从磁盘加载到
std::vector
内存中。在向量中堆
从堆中弹出并将数据保存到磁盘
什么会最快?
解决方案
渐近地,您的所有方法都是O(n log n):
- 在 an 中插入元素
std::map
是容器大小的对数。插入n 个元素将是O(n log n)。 - 应用于
std::sort
anstd::vector
是O(n log n)。 - 创建堆可以在线性时间内完成
std::make_heap
。但是,从堆中弹出一个元素是堆大小的对数。从堆中弹出n 个元素是O(n log n)。
但是,我希望由排序std::vector
和堆组成的方法比使用 的方法更快,std::map
因为由于更好的数据局部性,它们可以更多地利用缓存,即这两种情况下的元素由内存中连续分配的块组成而不是像std::map
.
另请注意,std::map
由于将地图节点粘合在一起的指针,使用 的方法比其他两种方法需要更多的空间。
推荐阅读
- javascript - 如何在js中向上滚动到另一个div内的div?
- c++ - 如何解决模棱两可的运算符重载问题?
- excel - 查找员工的两个条目之间的时间
- windows - UWP BluetoothDevice.FromIdAsync() 返回 null
- wordpress - 如何通过api提交联系表格7数据?
- swift - 如何使用 AVPlayer 在 SwiftUI 中的视频循环之间添加平滑过渡?
- xamarin.ios - 如何在 xamarin.ios 中显示我将通过 AZURE NOTIFICATION HUB 从后端收到的图像
- android - 双击时防止底部工作表对话框片段显示两次
- powershell - 有没有办法将数据添加到 PowerShell 中的现有 csv 文件?
- python - 线程只有在使用蓝牙功能时才会出现问题