Ada*_*ras 3 c++ tree performance
我想知道对于具有以下要求的集合,最通用的树结构是什么:
树结构需要支持有效的插入和删除,以及通过唯一ID快速查找.此外,找到第一个可用的未使用的唯一ID需要是快速操作.
什么样的树最适合这些要求?
编辑:这棵树将只在内存中保存; 在任何时候它都不会被持久化到磁盘上.我不需要担心碰到磁盘,磁盘缓存或任何类似的东西.这也是我不打算使用像SQLite这样的东西的原因.
根据您需要多快的速度,您可以将整个事物视为单个内存表mmap-ed到文件中.寻址是通过直接计算.您可以简单地链接空闲插槽,这样您就可以确切地知道下一个空闲插槽的确切位置.大多数访问最多有1或2个磁盘访问(取决于底层文件系统要求).在计算机上放置一块内存,你可能根本不会碰到磁盘.
我知道这听起来很蛮力,但你会惊讶于它的速度有多快.
更新响应: "我不是在寻找磁盘可持久解决方案"
好吧,如果你真的要在这个结构中有多达2 ^ 32个项目(时间有多大),那么你需要在机器上有足够的内存来容纳这只小狗,否则内核会开始交换进出的东西记忆的你.这仍然转化为击中磁盘.如果你让它交换,不要忘记检查交换区域的大小,你很可能不得不碰它.使用mmap(或类似的东西)有点像创建自己的私有交换区域,它可能对同一系统上运行的其他进程的影响较小.
我会注意到,一旦这个东西超过你的可用物理内存(无论你是使用交换空间还是mmap或B-tree或Black-Red或可扩展散列等),了解你的访问模式就变得至关重要.如果你在整个地方进行跳房子游戏,那么你将会大量击中磁盘.使用像B树(或几个类似结构中的任何一个)之类的结构的主要原因之一是树的顶层(包含索引)倾向于留在内存中(因为大多数分页算法使用LRU)和您只有在触摸叶子页时才会访问磁盘.
底线:它要么适合内存,要么不适合.如果没有,则您的10 ^ -9秒内存访问将变为10 ^ -3磁盘访问.比慢一百万倍. TANSTAAFL!