优化的arraylist

时间:2013-08-08 03:38:17

标签: c optimization

我有这个程序需要对数组中的字符串进行一些比较。首先想到的就是使用strcmp来检查数组中的两个字符串是否相同。现在考虑您只需要比较指向字符串的指针的选项。这将涉及一些准备工作,将每个元素实际上相同地映射到内存中的相同位置。

我已经完成了所有这些,通过准备strcmp,现在准备strstr(我认为更快)。 但是因为我需要检查每个字符串以将它们映射到它们的第一次出现,所以我得到了非常长的准备时间。我应该提一下,这个数组是几MB大。

以下是我想要做的一个例子:

[0x0: "I", 0x1: "am", 0x2: "done", 0x3: "here.", 0x4: "I", 0x5: "have", 0x6: "done", 0x7: "everything!"]

[0x10: 0x0, 0x11: 0x1, 0x12: 0x2, 0x13: 0x3, »0x14: 0x0«, 0x15: 0x5, »0x16: 0x2«, 0x17: 0x07]

现在问题是:还有另一种方法可以比我现在更快地进行这种映射吗?

1 个答案:

答案 0 :(得分:1)

如果仅仅是为了查看是否存在重复项...您可以在字符串数组上运行qsort(),如果您的sort函数找到重复项,您可以提前保释。或者,如果您需要删除重复项,那么让排序完成并从列表底部线性迭代,并在找到它们时将它们拉出(因为所有重复项将彼此相邻)。

如果字符串相对不同,strcmp()实际上只需要在失败的匹配之前检查第一批字符。所以它可能没有你想象的那么糟糕。

当然,执行此操作的难易程度取决于字符串实际存储在内存中的方式。

更新:

好的,根据您的更新...... Matt建议的哈希表可能效果最好:

  • 逐个浏览您的列表
  • 哈希字符串
  • 检查表格中是否已存在
  • 如果没有,请将其添加到表中并继续
  • 如果是,请使用表中的现有索引
  • ...然后继续下一个。

我认为这应该会给你相对不错的表现,总体而言。