Questions tagged «search-algorithms»

用于在某些指定的数据结构(最常见的是在树中)中查找元素的算法。

8
图形搜索:广度优先与深度优先
搜索图时,有两种简单的算法:广度优先和深度优先(通常通过将所有邻接图节点添加到队列(广度优先)或堆栈(深度优先)来完成)。 现在,一个相对于另一个有什么优势吗? 我能想到的: 如果您希望数据在图表内很远,那么深度优先可能会更早找到它,因为您可以非常快速地进入图表的较深部分。 相反,如果您希望数据在图表中靠前很远,那么广度优先的结果可能会更早。 我有什么想念的吗?还是主要取决于个人喜好?

3
为什么二元搜索比三元搜索快?
在搜索的阵列使用二进制搜索元素需要,在最坏情况下日志2次 Ñ迭代因为,在每一个步骤中,我们修剪我们的搜索空间的一半。相反,如果我们使用“三元搜索”,则每次迭代都将减少三分之二的搜索空间,因此最坏的情况应该是log 3 N &lt; log 2 N迭代...ññN日志2ñ日志2⁡ñ\log_2 N日志3ñ&lt; 日志2ñ日志3⁡ñ&lt;日志2⁡ñ\log_3 N < \log_2 N 似乎三元搜索更快,那么为什么要使用二元搜索呢?

5
寻找有趣的字谜
假设和是两个长度相同的字符串。两个字符串的拼写是双射映射这样每个。a1a2…ana1a2…ana_1a_2\ldots a_nb1b2…bnb1b2…bnb_1b_2\ldots b_np:[1…n]→[1…n]p:[1…n]→[1…n]p:[1\ldots n]\to[1\ldots n]ai=bp(i)ai=bp(i)a_i = b_{p(i)}iii 同一对字符串可能不止一个拼写。例如,如果 `abcab`和我们有和等。a=a=a=b=b=b=cababp1[1,2,3,4,5]→[4,5,1,2,3]p1[1,2,3,4,5]→[4,5,1,2,3]p_1[1,2,3,4,5]\to[4,5,1,2,3]p2[1,2,3,4,5]→[2,5,1,4,3]p2[1,2,3,4,5]→[2,5,1,4,3]p_2[1,2,3,4,5] \to [2,5,1,4,3] 我们要说的是,词法的权重 是一个人必须在第一个字符串中进行剪切的次数,才能获得可以重新排列以获取第二个字符串的块。形式上,这是的值个数,其中。也就是说,它是在该点的数量不会不正好1.适用于例如增加,和,因为切割一次,进入块和,和切口4次,分为五个大块。w(p)w(p)w(p)pppi∈[1…n−1]i∈[1…n−1]i\in[1\ldots n-1]p(i)+1≠p(i+1)p(i)+1≠p(i+1)p(i)+1\ne p(i+1)pppw(p1)=1w(p1)=1w(p_1) = 1w(p2)=4w(p2)=4w(p_2) = 4p1p1p_11234512345p2p2p_212345 假设存在两个字符串和的拼写。然后,至少一个词法必须具有最小的权重。可以说这是最轻的。(可能有多个最简单的拼写;我不在乎,因为我只对权重感兴趣。)aaabbb 题 我想要一种算法,给定存在两个字符串的两个字串,它们可以有效地产生两个字符串最轻的字串的精确权重。如果该算法还能产生最轻巧的字词排序,也可以,但不是必须的。 生成所有拼写并对其进行加权是一件相当简单的事情,但是可能会有很多,所以我宁愿直接找到轻型拼写的方法。 动机 引起该问题的原因如下。使计算机搜索字典并查找字谜(包含完全相同的字母的单词对)非常容易。但是产生的许多字谜没有意思。例如,在《韦伯斯特第二国际词典》中找到的最长的例子是: 胆囊 十二指肠造口术十二指肠胆囊造口术 这个问题应该清楚:这些都是索然无味,因为他们承认一个很轻的anagramming,简单地交流cholecysto,duedeno和stomy段,对于一个体重2.在另一方面,这种更短的例子是更令人惊讶和有趣: 海岸线 剖面 这里最轻的字谜权重为8。 我有一个程序使用此方法来定位有趣的字谜,即所有字谜的权重很高的字谜。但这是通过生成并加权所有可能的拼写来实现的,这很慢。

7
使用BFS / DFS查找树的直径的算法。为什么行得通?
该链接提供了一种使用BFS / DFS查找无向树的直径的算法。总结: 在图中的任何节点上运行BFS,记住您最后发现的节点。记住最后发现的节点v,从u运行BFS。d(u,v)是树的直径。 为什么行得通? 第2页,这提供了一个理由,但它是混淆。我引用了证明的初始部分: 在图中的任何节点上运行BFS,记住您最后发现的节点。记住最后发现的节点v,从u运行BFS。d(u,v)是树的直径。 正确性:令a和b为任意两个节点,使得d(a,b)是树的直径。从a到b有一条独特的路径。令t为BFS在该路径上发现的第一个节点。如果从s到u 的路径p1p1p_1和从a到b的p2p2p_2路径不共享边,则从t到u的路径包括s。所以 d(t,u)≥d(s,u)d(t,u)≥d(s,u)d(t,u) \ge d(s,u) d(t,u)≥d(s,a)d(t,u)≥d(s,a)d(t,u) \ge d(s,a) ....(更多不平等现象随之而来。) 不平等对我来说没有意义。

2
我如何在超市找到我的妻子?
如果两个人在迷宫中迷路,是否有一种算法可以供他们双方使用,而无需事先同意他们将使用哪种算法? 我认为该算法具有一些特点: 每个人都必须能够使用不对另一个人的决定做任何假设的逻辑来推导它,但是由于每个人都知道另一个人的立场相同,因此他们可以推论另一个必须作出的决定。 双方都必须采用完全相同的算法,因为双方的情况完全对称(双方都不了解对方的起始位置,迷宫的大小是固定的,并且由双方完全映射)。请注意,该算法不需要是确定性的:允许将其随机化。

7
一个在两个数组中不同的元素。如何有效地找到它?
我正在准备进行编码面试,但我真的想不出解决此问题的最有效方法。 假设我们有两个数组,这些数组由未排序的数字组成。数组2包含一个数字,数组1没有。两个数组都有随机定位的数字,不一定以相同的顺序或相同的索引。例如: 阵列1 [78,11,143,84,77,1,26,35 .... n] 数组2 [11,84,35,25,77,78,26,143 ... 21 ... n + 1] 找到不同数字的最快算法是什么?它的运行时间是多少?在此示例中,我们要查找的数字是21。 我的想法是遍历数组1并从数组2中删除该值。迭代直到完成。这应该在O(nlogn)O(nlog⁡n)O(n \log n)运行时间左右,对吗?

2
无向图上的最短路径?
所以我认为这个(虽然有些基本)问题属于这里: 假设我有一个大小为100的节点的图,以10x10的模式排列(请考虑棋盘)。该图是无向的和未加权的。在图形中移动涉及向前移动三个空间,向右或向左移动一个空间(类似于国际象棋骑士在棋盘上的移动方式)。 给定一个固定的开始节点,人们将如何找到通往板上其他任何节点的最短路径? 我以为可行的移动节点之间只有一条边。因此,鉴于此信息,我希望找到从起始节点到结束节点的最短路径。 我最初的想法是每条边的权重均为1。因此,我决定使用深度优先搜索的更改形式来进行此操作。 但是,我无法终生想象如何使用搜索获得最短路径。 我尝试的另一件事是将图以树形图作为起始节点作为根,然后选择最浅的(最低的行号)结果,该结果为我提供了所需的结束节点……这是可行的,但是效率极低,因此不适用于较大的图形。 有没有人有任何想法可以为我指出正确的方向? 非常感谢你。 (我试图对图表进行可视化处理,但由于声誉低下而无法执行)


4
查找一对不重叠的位向量
我给您列出了宽度为的n个位nn向量。您的目标是从列表中返回两个不共有1的位向量,或者报告不存在这样的对。ķkk 例如,如果我给您那么唯一的解决方案是。可替代地,输入没有解。任何包含全零位向量和另一个元素都具有平凡的解。[ 00110 ,01100 ,11000 ] [00110,01100,11000][00110, 01100, 11000]{ 00110 ,11000 } {00110,11000}\{00110, 11000\}[ 111 ,011 ,110 ,101 ] [111,011,110,101][111, 011, 110, 101]000 ... 0 000...0000...0Ë ee{ é ,000 ... 0 }{e,000...0}\{e, 000...0\} 这是一个稍微困难一点的示例,没有解决方案(每行都是位向量,黑色正方形为1s,白色正方形为0s): ■ ■ ■ ■ □ □ □ □ □ □ □ □ □ ■ □ □ …

2
可允许的启发式方法如何确保最佳解决方案?
当使用A *(或任何其他最佳路径查找算法)时,我们说使用的启发式方法应该是可以接受的,也就是说,它绝不应高估实际解路径的长度(或移动量)。 可允许的启发式方法如何确保最佳解决方案?我最好在寻找一个直观的解释。 如果需要,您可以使用8难题的曼哈顿距离启发法进行解释。

2
如何实现AO *算法?
我注意到在实现搜索算法时会使用不同的数据结构。例如,我们使用队列来实现广度优先搜索,使用堆栈来实现深度优先搜索,使用最小堆来实现A *算法。在这些情况下,我们不需要显式构造搜索树。 但是我找不到简单的数据结构来模拟AO *算法的搜索过程。我想知道是否显式构造搜索树是实现AO *算法的唯一方法?谁能为我提供有效的实施方案?

2
二进制搜索和插值搜索相结合背后是否有任何研究或理论?
我刚刚读过该算法是否仍可以视为二进制搜索算法?并回顾了几年前,我写了一个索引器/搜索日志文件,以按日期/时间窗口在大型纯文本文件中查找日志条目。 在这样做的同时,我决定尝试插值搜索(我不知道那是什么,我自己偶然发现了这个想法)。然后出于某种原因,我继续采用交替插值步骤与二进制拆分步骤的想法:在步骤0上,我将进行插值以确定测试点,然后在步骤1上,我将采用精确的中点等。 然后,我使用纯插值搜索,纯二进制搜索和组合尝试对系统进行了基准测试。在找到一组随机选择的时间之前,在时间和所需测试数量上,交替方法无疑是赢家。 受链接问题的启发,我只是快速搜索了“交替插值搜索和二进制搜索”,却一无所获。我还尝试了“对冲插值搜索”,如对某个答案的评论所建议的那样。 我偶然发现了一个已知的东西吗?对于某些类型的数据,它有更快的速度吗?日志文件通常在时间上很大(例如1-2 GB的文本,可能要搜索1000万行),并且日期/时间在其中的分布非常复杂,包括大量的活动,一般的高峰时间和安静时间。我的基准测试是从均匀分布的目标时间中采样得出的。

2
在地球连续地图上进行寻路的最新算法是什么?
假设我在挪威峡湾的某处有一个太阳能自动水面舰艇,提供有一组较新的地图,一个GPS接收器,并且没有从我这里下行传送详细命令的方法。例如,这艘船必须尽早到达海南岛。 在地球上寻找海上路线的确定性算法是什么? 它们的时间和内存复杂度是多少? 例如,在将地球的地图转换为具有连接的多边形(即球体/椭球上的Delaunay三角剖分)的图之后,我可以使用A *吗?还有其他可行的方法吗? 理想情况下,答案应为讨论上述问题的论文提供参考。 正如罗布·朗(Rob Lang)所指出的那样,算法必须符合通常的标准:在没有时间限制的情况下,导致地球上海洋两点之间的最短路径,否则表明寻路失败。 这里有一些有趣的子主题(用于在线计算的计算前时间/存储,在最后期限到来之前提供稍微次优的路由等),但这是主要问题的辅助内容。

3
仍然可以将此算法视为二进制搜索算法吗?
在执行第二个代码kata(要求您执行五次二进制搜索算法,每次使用不同的方法)时,我提出了一个略有不同的解决方案,其工作方式如下: 如果我有一个长度为100的排序数组,并且看到它的起始字段包含数字200而其终止字段包含数字400,那么作为数学研究人员,我可能会在搜索字段35周围开始搜索编号270,而不是普通二进制搜索算法中的字段50。 然后,如果数组的字段35上的数字是270,则35是我正在搜索的索引。 如果不是这种情况,我可以比较得到的数字(例如280),并重复执行数组下部的操作(所以我有35个字段,起始字段包含200,结束字段包含280),如果我找到的数字大于我要搜索的数字,或者大于数组的上部(例如,我有260个:现在我有65个索引,第一个包含260,最后一个包含400。定向,我会转向如果我得到的数字小于我要搜索的数字,则此子数组的索引4,即整个数组的索引39)。 问题是:可以将此算法视为二进制搜索算法吗?如果没有,它有自己的名字吗?

2
什么是通用搜索的外行解释?
我正在阅读有关计算机科学主题的书,但缺少一些先决条件。通常,当我碰到术语时,我不理解我只是在查找它们,但是对于通用搜索,我只是无法找到适合没有统计学/计算机科学背景的读者的解释。 我一直在阅读Scholarpedia上有关“ 通用搜索”的文章,该文章似乎涵盖了该主题。对于“ 通用搜索”(或“ 莱文搜索”)的含义,我将不胜感激。

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.