我有一个四维阵列,其中的值是单调的。如何有效地搜索价值。在四维阵列搜索元素具有特殊性能
3
A
回答
1
如果N不超过10000,那么不明白为什么你不能使用unordered_set。然后做一个单一的查找。如果每个维度都有重复值,那么您需要以某种方式跟踪该维度。但是,我不知道任何为C实现unordered_set的代码。因此,您可能必须使用C++。
如果您不能使用unordered_set,则由于数据是按排序顺序为每个维度,你也可以使用每个维度的二进制搜索。这意味着每个维度平均查找不超过15个值 - 假设每个维度中的元素总数小于16K。 15个查找* 4个维度= 60个查找。这太慢了吗?其他
一个改进可能是创建从4个维度一个大排序和独特的阵列和搜索一个代替。这将产生大约17次查找(假设< = 64K元素).vs。 60,这是3.5倍以上的速度。但是,这也取决于值的添加或删除的频率以确定它是否真的会更快 - 因为您必须在单个表中添加和删除它们。另外,不要忘记使用表格来跟踪重复值 - 如果适用的话。
如果值是比较小的整数 - 说十亿或更少,那么你可能能够使用一个位映象方案。位图方案比每个维度使用unordered_set要快。一个字节数组可以用作位图。在位图中设置的值意味着该值存在。例如,如果该值为零,则将设置位零。如果该值为3,则会设置位2。如果该值为5,则会设置位4等。因此,需要使用100MB来映射所有值为10亿(2^30)的值。如果每个维度中都存在重复值,那么您需要跟踪该维度,以便从维度中删除值时 - 除非它不存在于其他维度中,否则不会从位图中删除。如果您的值是浮点数,那么如果有效数字的总数为< = 9,则可以将它们翻译为整数。如果这些值是字符串或结构体,那么如果可以找出一种方法,则位图方案可能仍然有效将其翻译为唯一的整数。
相关问题
- 1. 弹性搜索阵列元素的查询字符串搜索
- 2. XPath:选择具有特殊字符特定属性的元素
- 3. 具有特殊值的Stimulsoft“tube”元素
- 4. 在阵列中搜索元素 - 特定*不*原始对象
- 5. 在弹性搜索特殊字符
- 6. 搜索重复的元素阵列
- 7. 如何选择后代具有特殊属性的元素
- 8. 阵列搜索功能斯威夫特
- 9. Zend Lucene不能通过特殊字符搜索所有搜索
- 10. HTML元素阵列 - 多维
- 11. 使用线性索引映射到四维阵列
- 12. 从MongoDB的阵列获取特定元素与$文本搜索
- 13. 具有特殊属性值
- 14. 如何在多维搜索阵列
- 15. 选择具有特殊字符的列表元素
- 16. 麻烦与四维阵列
- 17. XPath特定元素搜索
- 18. 弹性搜索NGRAM特殊字符
- 19. 如何在具有特殊字符的solr中搜索
- 20. 搜索元元素列表
- 21. 在二维阵列的第二个元素上的红宝石插值搜索
- 22. PHP搜索多维数组的值,然后将这个元素在阵列
- 23. 搜索具有特定内容的元素?
- 24. 线性搜索阵列
- 25. 二维阵列排序列表的线性搜索
- 26. 在具有特定元素的元素内设置CSS属性
- 27. 搜索并替换文件中的现有阵列元素 - PHP
- 28. 具有特定属性的select元素
- 29. 子阵列具有特定值时删除数组元素
- 30. 通过二维阵列搜索多次
无论哪种方式,你至少在O(N^3)复杂性。实现一个全面的搜索,看看它是否有合理的运行时间。如果不是这样,即使您将算法改进了2,3,5倍 - 速度也不够快。 – Dariusz 2014-09-23 11:41:04
通过微不足道的我的意思是O(N^3日志N),其中有3个diemensions蛮力和二进制搜索最后一个。它应该很快实施。我认为可以实现O(N^3)的复杂性(因为可能为N^2获得O(N + M)),尽管我想不出一种算法能做到这一点。 – Dariusz 2014-09-23 17:23:53
** N **有多大?如果它足够小,也许你可以使用散列表(值,位置)。 – 2014-09-23 21:30:06