排序基于TDictionary的记录的最佳选项

时间:2014-02-13 12:32:14

标签: delphi delphi-xe unidac

从复杂的评分过程中我得到了一个TDictionary结构:

target_results : TDictionary<longint, double>;

该键表示MySQL表中记录的id。从该ID我可以检索归档和文件名。我需要通过以下选项之一提供这些结果:

1. dictionary value (solved: I'm doing this by assigning the dictionary to an array, sorting it and then retrieving the filename and date for each result, from the database)
2. filename
3. filedate

我正在考虑使用TVirtualTable(来自Devart),因为我已经在这个项目中使用了UniDAC。有人可以建议更快,更灵活,更原生的方法吗?

1 个答案:

答案 0 :(得分:1)

您无法对字典进行排序。唯一具有排序内置的可比结构是Judy阵列。但是,您可以对字典指向的项进行排序。如果我理解正确的话,您似乎已经对键进行了排序。现在,如果要按不同的方式排序,则对其他数据执行相同操作。算法将是:

  1. 定义包含与您相关的所有数据的类或记录
  2. 将TDictionary项目迭代或枚举为通用TList,并使用数据库中的数据填写每个项目或记录
  3. 按照适当的标准对TList中的项目进行排序。您可以在此处查看此类排序的示例:http://delphi.about.com/od/delphitips2009/qt/sort-generic.htm
  4. 请记住,这将是迭代的O(N),其中N不仅是数据库中的项目数,而且是散列表中的桶数。然后还有额外的开销,即从数据库中为每个项目生成数据,最后有O(NLogN)进行快速排序。

    TDictionary因为所有哈希表都是用于查找的,所以它很擅长并且在其他任务(例如迭代甚至排序)上都很糟糕。如果你想加快速度,可以使用按适当的键排序的单独列表,这样你就可以迭代已排序的列表并从数据库中获取数据。如果排序非常重要且完成了很多次,那么使用二叉树而不是哈希表。每个搜索字段可以有一个二叉树。对于二叉树,我的意思是平衡的二叉树,如AVL树。

    例如二进制树对此有好处,因为它们在插入时保持排序。没有更多可用数据,无法帮助您。