C数据库设计,可按多个字段排序

时间:2012-03-09 05:56:10

标签: c database performance sorting

如果内存不是我的特定应用程序的问题(输入,查找和排序速度是优先级),那么什么样的数据结构/概念将是多字段排名表的最佳选择?

例如,假设我想为游戏创建一个名人堂,可以按最高分(独立于用户名),用户名(在用户按其最高分数排名之前将同一用户的所有分数放在一起)进行排序,达到或达到水平(独立于分数或名称)。在这个例子中,如果我按照每个玩家的最高分来命令链表,矢量或任何其他顺序数据结构,它会搜索其他字段 - 如级别和非最高分数 - 更多迭代(即迭代)所有寻找舞台,或寻找特定的乐谱范围),除非我设想一些其他方式来存储我输入新数据时排序的信息。

问题在于C / C ++中是否存在更高效(尽管是复杂且内存消耗)的方法或数据库结构,这种方法或数据库结构可能会为这种多字段排序做好准备。链接列表对于简单的分数排名似乎很好,我甚至可以通过对单个字段(播放器名称或达到的级别)进行散列来组织哈希表,以按单个字段排序,但随后其他字段需要O(N)来查找,更糟糕的是排序。只有三个字段,我想知道是否有一种方法(如集合或辅助列表)可以防止在我们事先知道的某些预先要求的排序中进行迭代。

2 个答案:

答案 0 :(得分:3)

以与数据库相同的方式执行此操作:使用索引结构。您将主数据作为多个记录(结构),可能根据您的一个排序标准进行排序。然后你有索引结构,每个索引结构根据你的一个其他排序标准排序,但这些索引结构不包含所有数据的副本,只是指向主数据记录的指针。 (将“索引”视为书中的索引,页码“指向”主数据主体。)

为索引结构使用有序链接列表将为您提供一种快速简单的按顺序浏览记录的方法,但如果您需要搜索给定值,并且在插入新数据时类似,则速度会很慢。

哈希表将具有快速搜索和插入功能,但(使用普通哈希表)根本无法帮助您进行排序。

所以我建议某种树形结构。平衡二叉树(寻找AVL树)在主存中很好用。

但是不要忘记使用实际数据库的选项! MySQL和SQLite等数据库管理器可以与您的程序链接,无需单独的服务器,并且可以使用程序中嵌入的SQL轻松地完成所有排序和索引。它可能比你手工制作自己的主存储器数据结构要慢一点,或者如果你使用库中的主存储器数据结构,但它可能更容易编码,你不需要写单独的代码将数据保存在磁盘上。

答案 1 :(得分:2)

因此,您已经知道如何存储数据并根据单个字段对其进行排序。假设单个条目的字段值是独立的,那么您能够获得所需内容的唯一方法是保留三个不同的列表(使用您选择的数据结构),每个列表都排序为不同的领域。你将使用三倍于单个列表的内存指针。

至于每个列表应该是什么数据结构,使用binary max heap将是有效的。插入是lg(N),按顺序显示单个条目是O(1)(所以O(N)看到所有条目)。如果在某些列表副本中,条目需要按另一个字段进行子排序,请在比较函数调用中考虑这一点。