c - 如果所有数据都放入内存,那么执行 "SELECT ...WHERE ..."操作的最快方法是什么?

标签 c algorithm memory

<分区>

如果所有数据都放入内存,这意味着媒体速度要快得多,那么执行“SELECT .. WHERE ..”查询(过滤数据)的最快方法是什么?到目前为止,我想到的选项:

1) b树类算法,但可能仍然需要索引和更大的空间

2) 定长数组,尺寸较小但可能较慢。

如果速度和大小都是问题,那么还有其他更好的方法吗

最佳答案

这取决于您的具体情况 - 您需要快速执行哪些操作、确切大小是多少等等。一些例子:

  1. 对于AND 查询,通常会维护一组排序列表(每个功能都有一个列表)。此数据结构称为 inverted index 和 经常被搜索引擎用来从 给定的查询。 (例如,Apache Lucene 使用此数据结构)。
  2. 如果可以使用数组 - 并且需要对数据进行迭代 - 这是一种非常有效的方法,因为数组基本上是最cache有高效的数据结构。在大多数情况下,从数组中顺序读取比任何其他 DS 都快得多,因为它使您获得最少的“命中未命中”,而这通常是迭代数据时的瓶颈。
  3. 例如,如果您的数据是字符串,并且您要根据一些字符串属性(例如前缀)使用为字符串设计的数据结构进行过滤,例如 trieradix tree - 可能会让您获得最佳表现。

底线:如果您打算做一些定制的事情来增强默认库的性能,您应该在设计您选择的数据结构之前考虑具体的问题细节。

关于c - 如果所有数据都放入内存,那么执行 "SELECT ...WHERE ..."操作的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12779192/

相关文章:

algorithm - 是否有一种有效的方法来近似 (a/b)^n,其中 a、b 和 n 是无符号整数?

python - 分数背包算法 Python 输入问题

java - Hotspot Java/JVM 是如何存储内存的?

c++ - 将字符串添加到 vector<string> 循环时内存损坏

c - 使用用户输入输入和输出 Struct 的数组

c - 两个线程中的同步问题共享一个队列以使用临界区进行读写

algorithm - 什么类别的算法可以用于时间表?

c++ - 对象 vector 中的内存访问冲突

C fwrite 和文件大小

c - 通过 TCP 的字符串长度