【问题标题】:Index (type) for searching (large) unsorted array用于搜索(大)未排序数组的索引(类型)
【发布时间】:2021-01-23 07:30:36
【问题描述】:

我有一个将(有时)大型 CSV 文件加载到数组中的程序。数据无法排序,不知道数据是文本还是数字。这取决于客户。

例子可以是

1;JOHN;DOE
2;JANE;DOE;
3;BOBBY;NOTABLES

但也可以是字符串

MB9384HJ;TEST1
B9284918;TEST2

行数可能高达几百万。

我想在列中搜索特定值(这是提前知道的,这是我的“关键索引列”)。假设这是唯一的。关键是找到该列在哪一行。

目前代码正在从 1..n 遍历并进行比较。这显然在接近尾声时变慢了。

我正在考虑以下选项:

  • 具有键索引值和记录号的内存 SQLite 数据库
  • 带键的 TStringDictionary,记录为对
  • 哈希字符串列表

我的想法是:我不是遍历数组,而是查询索引的键(客户端提供要搜索的项目,它必须是随机访问的)。然后我马上得到数组的rownumber,就可以取数据了。

这些(或其他,如果有的话)中哪一个是更好的选择?

【问题讨论】:

  • 我会使用TDictionary(实际上是一个哈希表)将键映射到记录号。不要忘记将合适的容量传递给constructor 以避免重新散列。

标签: csv delphi tdictionary


【解决方案1】:

如果您只想搜索密钥,SQLite 可能太多了。如果您使用 CSV 填充 SQLite 表并且不仅要对键而且还要对其他列进行复杂的查询,那将会很有趣。

哈希字符串列表可能更快,但存在哈希冲突问题。

字典可能是您特定情况下的最佳解决方案。 Delphi RTL 提供了所需的泛型类,这很容易。

【讨论】:

  • 尝试使用“Delphi Fundamentals 5.00”中的 TIntegerDictionary,因为我的 delphi 版本在 D2009 之前。向字典中添加 750.000 条记录的时间小于 1 秒。搜索结果:阵列搜索 1000 倍:30-40 秒。字典搜索 : 100.000x :
【解决方案2】:

虽然较新的 Delphi (2009+) 已内置 TDictionary,但此处(一种可能的)解决方案适用于较旧的 Delphi 版本。

这是使用Delphi Fundamentals 5,甚至可以为 D6 编译。

uses 
   flcDataStructs;
//...
var
   thedict : TIntegerDictionary;
   i : integer;

begin
  thedict := TIntegerDictionary.Create;
  thedicnr.DuplicatesAction := ddIgnore;  // should there be duplicates in my key column

  for i := 0 to length(dataarray)-1 do
    begin
      thedict.Add(dataarray[i], i);
    end;
end;

// to use:
//    rownumber := thedict['stringToSearch'];

【讨论】:

    猜你喜欢
    • 2010-12-25
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多