Questions tagged «algorithm»

算法是定义明确的问题解决方案的一系列明确定义的步骤。当您的问题与算法设计有关时,请使用此标签。

9
大型图形的A *算法,对缓存快捷方式有何想法?
我正在OpenStreetMap地图上编写快递/后勤仿真,并且已经意识到,如下图所示的基本A *算法对于大型地图(例如大伦敦)来说不够快。 绿色节点对应于放置在开放集/优先级队列中的节点,由于数量巨大(整个地图大约为1-2百万),因此需要5秒钟左右的时间才能找到所描绘的路线。不幸的是,每条路线100ms大约是我的绝对极限。 当前,节点既存储在邻接表中,又存储在空间100x100 2D数组中。 我正在寻找可以权衡预处理时间,空间以及必要时优化路线以加快查询速度的方法。根据探查器,用于启发式成本的直线Haversine公式是最昂贵的函数-我已尽我所能优化了基本A *。 例如,我在考虑,如果我从2D数组的每个象限中选择一个任意的节点X并在每个象限之间运行A *,我可以将路由存储到磁盘以进行后续仿真。查询时,我只能在象限中​​运行A *搜索,以在预先计算的路径和X之间进行搜索。 是否有我上面描述的更完善的版本,或者也许是我应该采用的其他方法。非常感谢! 为了记录在案,以下是一些基准测试结果,用于任意加权启发式成本并计算10对随机选取的节点之间的路径: Weight // AvgDist% // Time (ms) 1 1 1461.2 1.05 1 1327.2 1.1 1 900.7 1.2 1.019658848 196.4 1.3 1.027619169 53.6 1.4 1.044714394 33.6 1.5 1.063963413 25.5 1.6 1.071694171 24.1 1.7 1.084093229 24.3 1.8 1.092208509 22 1.9 1.109188175 …

9
性能问题:Java与C ++
我一直都听说C ++比Java更高效(这就是为什么大多数游戏都是用C ++开发的原因)。 我写了一个小的算法,使用完全相同的算法来解决Java和C ++中的“八皇后难题”,然后开始增加数字或平方。当到达20 * 20甚至22 * 22的棋盘时,似乎Java更为有效(3秒对C ++为66秒)。 我不知道为什么,但是我是从C ++开始的,所以我很可能会犯一些巨大的性能错误,所以我很乐意接受任何可以帮助我了解发生了什么的信息。 以下是我在Java中使用的代码: import java.awt.Point; import java.util.ArrayList; import java.util.List; public class HuitDames { /** * La liste des coordnnées des dames. */ private static List<Point> positions = new ArrayList<>(); /** * Largeur de la grille. */ private static final int …

7
Java中的稀疏矩阵/数组
我正在开发一个用Java编写的项目,该项目要求我建立一个非常大的2-D稀疏数组。非常稀疏,如果有所作为。无论如何:此应用程序最关键的方面是时间效率(假定内存负载,尽管不是无限的以至于我无法使用标准的二维数组-关键范围在两个维度上都在数十亿之内) )。 在数组的千亿个单元中,将有数十万个单元包含一个对象。我需要能够非常快速地修改单元格内容。 无论如何:有人知道为此目的特别好的图书馆吗?它必须是伯克利,LGPL或类似的许可证(没有GPL,因为该产品不能完全开源)。或者,如果只有一种非常简单的方法来制作自制的稀疏数组对象,那也可以。 我正在考虑MTJ,但尚未听到有关其质量的任何意见。

5
对几乎排序的数组排序(元素错位不超过k)
最近有人问我这个面试问题: 您将得到一个几乎已排序的数组,因为每个N元素的错位可能不超过k正确排序顺序的位置。寻找一种时空高效的算法对数组进行排序。 我有O(N log k)如下解决方案。 让我们来表示arr[0..n)从索引0(包括)到N(不包括)的数组元素。 分类 arr[0..2k) 现在我们知道arr[0..k)它们处于最终排序位置... ...但是arr[k..2k)可能仍然被放错位置k! 分类 arr[k..3k) 现在我们知道arr[k..2k)它们处于最终排序位置... ...但arr[2k..3k)可能仍会被k 分类 arr[2k..4k) .... 直到您进行排序arr[ik..N),然后您就完成了! 当您2k剩余的元素少于时,此最后一步可能会比其他步骤便宜 在每个步骤中,您最多要对中的2k元素进行排序,请O(k log k)至少k在每个步骤的末尾将元素置于其最终排序位置。有O(N/k)步骤,因此总体复杂度为O(N log k)。 我的问题是: 是O(N log k)最优的吗?这可以改善吗? 您能做到这一点而无需(部分)重新排序相同的元素吗?

10
从集合中选择随机子集的最佳方法?
我在Vector中有一组对象,我想从中选择一个随机子集(例如,返回100个项目;随机选择5个)。在我的第一遍(非常仓促)中,我做了一个非常简单甚至过于聪明的解决方案: Vector itemsVector = getItems(); Collections.shuffle(itemsVector); itemsVector.setSize(5); 尽管这样做的好处是简单易用,但我怀疑它的伸缩性不会很好,即Collections.shuffle()至少必须为O(n)。我不太聪明的选择是 Vector itemsVector = getItems(); Random rand = new Random(System.currentTimeMillis()); // would make this static to the class List subsetList = new ArrayList(5); for (int i = 0; i < 5; i++) { // be sure to use Vector.remove() or you may get …

1
实现字典的最佳数据结构?
存储字典中所有单词的最佳数据结构是什么?我能想到的最好的方法是使用HashMap,它将映射到HashTable。基本上,根据第一个字符,我们将获得关联HashTable,然后使用该关联,可以添加从该字符开始的单词。然后,我们将基于字符串选择一个好的哈希函数。 有没有更好的方法?

5
2个数字之间的差异
我需要完美的算法或C#函数来计算2个十进制数字之间的差异(距离)。 例如: 100和25之间的差是75 100,而-25是125 -100,-115是15 -500,而100是600 是否有C#函数或非常优雅的算法来计算此值,否则我必须分别使用if s处理每种情况。 如果有这样的功能或算法,那是哪一个呢?
69 c#  algorithm  math  numbers 

17
哈希查找或二进制搜索哪个更快?
如果给定了一组静态对象(静态的,一旦加载就很少加载,就意味着它永远不会变化),需要在其中进行重复并发查找以达到最佳性能,更好的情况是,HashMap还是使用某些自定义比较器进行二进制搜索的数组? 答案是对象还是结构类型的函数?哈希和/或相等函数性能?哈希唯一性?清单大小? Hashset尺寸/布景尺寸? 我正在查看的布景大小可以在500k到10m之间,以防信息有用。 当我在寻找C#答案时,我认为真正的数学答案不在于语言,因此我不包含该标签。但是,如果有C#特定的事情要注意,则需要该信息。

14
具有低碰撞率和32位整数的快速字符串哈希算法
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗?更新问题,使其成为Stack Overflow的主题。 5年前关闭。 改善这个问题 我想快速搜索许多无关的命名事物。“ aardvark”在任何地方都始终是“ aardvark”,因此对字符串进行哈希处理并重新使用整数可以很好地加快比较速度。整个名称集是未知的(并且会随时间变化)。什么是快速字符串哈希算法,它将生成较小的(32或16)位值并且具有较低的冲突率? 我希望看到针对C / C ++的优化实现。
68 c++  algorithm  string  hash 

5
列表是否可以被另一个整除?
问题 假设您有两个列表A = [a_1, a_2, ..., a_n]和B = [b_1, b_2, ..., b_n]整数。我们说A是潜在的,可分割的B,如果有一个置换B,使得a_i整除b_i所有i。问题是:是否可以重新排序(即置换)B以便所有人都a_i可以整除?例如,如果您有b_ii A = [6, 12, 8] B = [3, 4, 6] 那么答案是True,因为B可以重新排序是B = [3, 6, 4],然后我们就会有a_1 / b_1 = 2,a_2 / b_2 = 2和a_3 / b_3 = 2,所有这一切都是整数,因此A是潜在的,整除B。 作为应该输出的示例False,我们可以有: A = [10, 12, 6, 5, 21, 25] B = …

30
颠倒字符串中单词的顺序
我有这个string s1 = "My name is X Y Z",我想颠倒单词的顺序,这样s1 = "Z Y X is name My"。 我可以使用其他数组来做到这一点。我想了很辛苦,但是有可能做到这一点(不使用其他数据结构)并且时间复杂度为O(n)吗?

12
数百万个3D点:如何找到最接近给定点的10个点?
3-d中的一个点由(x,y,z)定义。任何两个点(X,Y,Z)和(x,y,z)之间的距离d为d = Sqrt [(Xx)^ 2 +(Yy)^ 2 +(Zz)^ 2]。现在,文件中有一百万个条目,每个条目都是某个空间点,没有特定的顺序。给定任意一点(a,b,c),请找到与其最近的10个点。您将如何存储百万点,以及如何从该数据结构中检索这10点。

30
在数字数组中查找缺失数字的最快方法
这个问题的答案是社区的努力。编辑现有答案以改善此职位。它目前不接受新的答案或互动。 我有一个从1到100(包括两端)的数字数组。数组的大小为100。将数字随机添加到数组中,但是数组中有一个随机的空插槽。找到该插槽的最快方法以及应在插槽中放入的编号是什么?最好使用Java解决方案。
67 java  arrays  algorithm 

9
给定素数N,计算下一个素数?
一位同事刚刚告诉我,由于与哈希相关的不可思议的原因,C#词典集合将按质数调整大小。我的直接问题是:“它怎么知道下一个素数?它们是在大型表中还是在运行中进行计算?这是在插入时导致确定大小的可怕的不确定性运行时” 所以我的问题是,给定N(一个质数),计算下一个质数的最有效方法是什么?
67 algorithm  math  primes 

9
B树比AVL或RedBlack树快吗?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow的主题。 7年前关闭。 改善这个问题 我知道性能从来都不是黑白的,通常情况下,一种实现在X情况下更快,而在Y情况下则慢,等等。但是总的来说,B树比AVL或RedBlack树快吗?与AVL树(甚至可能是RedBlack-tree)相比,它们的实现要复杂得多,但是它们是否更快(它们的复杂性是否有回报)? 编辑:我还要补充一点,如果它们更快,那么等效的AVL / RedBlack树(就节点/内容而言)-为什么它们更快?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.