Questions tagged «algorithms»

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

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。 我有一个程序使用此方法来定位有趣的字谜,即所有字谜的权重很高的字谜。但这是通过生成并加权所有可能的拼写来实现的,这很慢。

2
用少于N个随机位来模拟2 ^ N中的1的概率
说我需要模拟以下离散分布: P(X=k)={12N,1−12N,if k=1if k=0P(X=k)={12N,if k=11−12N,if k=0 P(X = k) = \begin{cases} \frac{1}{2^N}, & \text{if $k = 1$} \\ 1 - \frac{1}{2^N}, & \text{if $k = 0$} \end{cases} 最明显的方法是绘制NNN随机位,并检查它们是否均等于000(或111)。但是,信息论说 S=−∑iPilogPi=−12Nlog12N−(1−12N)log(1−12N)=12Nlog2N+(1−12N)log2N2N−1→0S=−∑iPilog⁡Pi=−12Nlog⁡12N−(1−12N)log⁡(1−12N)=12Nlog⁡2N+(1−12N)log⁡2N2N−1→0 \begin{align} S & = - \sum_{i} P_i \log{P_i} \\ & = - \frac{1}{2^N} \log{\frac{1}{2^N}} - \left(1 - \frac{1}{2^N}\right) \log{\left(1 - \frac{1}{2^N}\right)} …

5
将元素添加到排序数组
最快的方法是什么(从算法的角度以及实际的角度来看)? 我在按照以下思路思考。 我可以添加到数组的末尾,然后使用Bubblesort,因为它的最佳情况(开始时是完全排序的数组)接近于此,并且具有线性运行时间(最佳情况)。 另一方面,如果我知道我是从排序数组开始的,则可以使用二进制搜索来查找给定元素的插入点。 我的直觉是,第二种方法几乎是最优的,但好奇地想知道那里有什么。 如何最好地做到这一点?

8
成为一个不了解计算复杂性的程序员是否有问题?
我在大学里分配了一个练习。我把它带回家并尝试编写一种算法来解决它,我想这与图有关,可以找到连接的组件。 然后,我想到了最琐碎的事情,然后告诉我的讲师。经过简短的观察,他认为我的解决方案的运行时复杂性是不可行的,并显示出一些更有效的方法。而且有一种传统的程序员不知道什么是计算复杂性(我就是其中之一),所以如果程序员不知道什么是计算复杂性会存在问题吗?

1
哈希表与二叉树
当实现字典时(“我想通过他们的客户ID查找客户数据”),使用的典型数据结构是哈希表和二进制搜索树。例如,我知道C ++ STL库使用(平衡的)二进制搜索树实现字典(它们称为地图),而.NET框架在后台使用哈希表。 这些数据结构的优缺点是什么?在某些情况下还有其他合理的选择吗? 请注意,对于键具有强大的基础结构的情况,例如,它们都是1到n之间的整数或类似的东西,我并不特别感兴趣。

7
随机算法与不确定算法之间的区别和关系?
随机算法与不确定算法之间有什么区别和关系? 来自维基百科 甲随机算法是一种算法,其采用一程度的随机性作为其逻辑的一部分。该算法通常使用统一的随机位作为辅助输入来指导其行为,以期在所有随机位的可能选择的“平均情况”下获得良好的性能。形式上,算法的性能将是由随机位确定的随机变量;因此,运行时间或输出(或两者)都是随机变量。 与确定性算法相反,非确定性算法是在不同的运行过程中表现出不同行为的算法。每次运行算法都有几种不同的行为方式。一个并行算法可因竞争条件不同在不同的运行执行。一个概率算法的行为取决于随机数发生器。解决非确定性多项式时间问题的算法可以在多项式时间或指数时间内运行,具体取决于其在执行过程中所做的选择。 随机算法和概率算法是同一概念吗? 如果是,则随机算法只是一种不确定性算法吗?

4
枚举一定大小的所有非同构图
我想枚举所有大小为无向图,但是我只需要每个同构类的一个实例。换句话说,我想枚举个顶点上的所有非同构(无向)图。我怎样才能做到这一点?nnnnnn 更准确地说,我想要一种算法,该算法将生成具有以下特性的无向图的序列:对于个顶点上的每个无向图,都存在一个索引,使得与同构。我希望该算法尽可能高效。换句话说,我关心的指标是生成和迭代此图列表的运行时间。第二个目标是,如果算法不太复杂而无法实现,那就太好了。G1,G2,…,GkG1,G2,…,GkG_1,G_2,\dots,G_kGGGnnniiiGGGGiGiG_i 请注意,每个同构类至少需要有一个图,但是如果该算法产生多个实例,则可以。特别是,如果输出序列包含两个同构图,则可以,只要这可以帮助您更轻松地找到这样的算法或启用更有效的算法,只要它覆盖所有可能的图即可。 我的应用程序如下:我有一个程序要在大小为所有图形上进行测试。我知道如果两个图是同构的,则我的程序将在两个同构上表现相同(对两个图都正确,或者对两个图都不正确),因此足以枚举每个同构类的至少一个代表,然后对其进行测试。对这些输入进行编程。在我的应用程序中,很小。nnnnnn 我考虑过一些候选算法: 我可以列举所有可能的邻接矩阵,即所有对称的 0或1矩阵,对角线都为0。但是,这需要枚举矩阵。这些矩阵中有许多将表示同构图,因此这似乎在浪费大量精力。n×nn×nn\times n2n(n−1)/22n(n−1)/22^{n(n-1)/2} 我可以列举所有可能的邻接矩阵,并针对每个矩阵测试它与我先前输出的任何图是否同构;如果它与之前输出的内容不是同构的,则将其输出。这将大大缩短输出列表,但是仍然需要至少个计算步骤(即使我们假设图形同构检查是超快的),因此通过我的指标。2n(n−1)/22n(n−1)/22^{n(n-1)/2} 可以枚举邻接矩阵的子集。特别是,如果是个顶点,则可以不失一般性地假设顶点的排列方式为。换句话说,每个图都是同构的,其中顶点以非降序排列。因此,仅枚举具有此属性的邻接矩阵就足够了。我不知道这样的邻接到底有多少矩阵也有,但它是许多不到他们可以用比少很多被列举GGGnnnV={v1,…,vn}V={v1,…,vn}V=\{v_1,\dots,v_n\}degv1≤degv2≤⋯≤degvndeg⁡v1≤deg⁡v2≤⋯≤deg⁡vn\deg v_1 \le \deg v_2 \le \cdots \le \deg v_n2n(n−1)/22n(n−1)/22^{n(n-1)/2}2n(n−1)/22n(n−1)/22^{n(n-1)/2}计算步骤。但是,这仍然留下了很多冗余:许多同构类仍然会被覆盖很多次,因此我怀疑这是最优的。 我们可以做得更好吗?如果我理解正确,大约是非同构图的等价类。我们能否找到一种运行时间比上述算法更好的算法?我们可以接近下界?我主要关心小(例如或左右;足够小以至于可以合理地运行这样的算法来完成),而不是大的渐近性。2n(n−1)/2/n!2n(n−1)/2/n!2^{n(n-1)/2}/n!∼2n(n−1)/2/n!∼2n(n−1)/2/n!\sim 2^{n(n-1)/2}/n!nnnn=5n=5n=5n=8n=8n=8nnn 相关:构建不等价的二元矩阵(尽管不幸的是,似乎没有收到有效的答案)。

1
在有向图中计算两个节点之间的简单路径的数量有多难?
有一个简单的多项式算法可以确定有向图中两个节点之间是否存在路径(只需使用例如深度优先搜索就可以进行常规图遍历)。 但是,令人惊讶的是,如果我们不想计算存在的数量而不想测试路径的数量,那么问题就会变得更加棘手。 如果我们允许路径重用顶点,那么有一种动态编程解决方案可以找到从s到t的n条边的路径数量。但是,如果我们只允许不重复使用顶点的简单路径,那么我能想到的唯一解决方案是路径的蛮力枚举,这具有指数时间复杂性。 所以我问 计算两个顶点之间的简单路径数难吗? 如果是这样,那是NP完全的吗?(我说这是因为从技术上讲这不是决策问题...) P中是否还有其他类似的难点问题?**

2
在哪里获取图表来测试我的搜索算法?
我正在实现一组路径查找算法,例如Dijkstra的,Depth First等。 最初,我使用了两个自制的图表,但现在我想进一步挑战一下,因此我正在寻找 基准测试中使用的图表; 现实世界中的城市图表(或从Google地图上下载此类信息的方法,或者其他任何可能的来源)。 我希望这些资源具有或允许我轻松创建边界,以便在可能的情况下尝试针对不同大小的图形集进行算法。 我正在寻找简单的解决方案,因为我不希望偏离主要目标(比较一组不同的算法),所以我需要一种快速的方法来将图形数据转换为自己的格式(基本上是连接(x, y)点集)。 更具体地说,我正在寻找的是2D循环图。如果这些图反映了现实世界中的城市街道(考虑单向街道,两向街道等,那就更好了!)。

4
如何确定社交网络中可能的连接?
我很想确定一种解决“建议的朋友”算法的方法。 Facebook具有一项功能,它会向您推荐您可能认识的个人。这些用户通常(不包括用户特别推荐朋友的极端情况)与自己的网络高度相似。即,共同的朋友数量很多。我认为Twitter的“关注对象”机制遵循类似的路径。 Facebook员工Stephen Doyle(Igy)表示,使用EdgeRank公式的相关新闻提要似乎表明,比起类似外表之类的朋友,有价值的更多。另一个用户建议使用Google Rank系统。 Facebook的指出他们的新闻饲料优化为哪里∑uewede∑uewede\sum u_{e}w_{e}d_{e} =查看用户与边缘创建者之间的亲和力分数 w e =该边缘的权重(创建,评论,喜欢,标签等) d e =基于创建边缘多长时间的时间衰减因子 ueueu_{e} wewew_{e} deded_{e} 对这些项目求和应该可以得出对象的等级,正如Igy所暗示的那样,这意味着建议朋友使用相似格式的东西。 所以我猜想这是通常通过等级系统完成所有类型的连接的方式吗?

4
从单纯形均匀采样
我正在寻找一种算法来生成N个随机数的数组,这样N个数字的总和为1,所有数字都位于0和1之内。例如,N = 3,即随机点(x,y, z)应位于三角形内: x + y + z = 1 0 < x < 1 0 < y < 1 0 < z < 1 理想情况下,我希望该区域内的每个点都具有相等的概率。如果太难了,我可以放弃要求。谢谢。

2
如何有效地确定给定的梯子是否有效?
在我当地的壁球俱乐部,有一个梯子的工作原理如下。 在本赛季开始时,我们会在单独的一行中构建一个表,其中包含俱乐部的每个成员的姓名。 然后,我们在每个名字旁边写上获胜游戏数和玩游戏数(格式:玩家获胜/游戏)。 因此,在本赛季开始时,表格如下所示: Carol 0/0 Billy 0/0 Alice 0/0 Daffyd 0/0 任何两名玩家均可参加比赛,其中一名玩家获胜。如果最接近桌面底部的玩家获胜,则将切换玩家的位置。然后,我们重复步骤2,更新每个玩家旁边的获胜次数和比赛数。例如,如果爱丽丝击败比利,我们有 Carol 0/0 Alice 1/1 Billy 0/1 Daffyd 0/0 这些比赛在整个赛季中持续进行,最终导致球员按实力顺序排列。 不幸的是,更新是以相当偶然的方式发生的,因此会出错。以下是无效表格的一些示例,也就是说,对于某些开始顺序(我们忘记了本赛季开始时使用的顺序)以及比赛和结果的顺序,无法正确按照上述步骤操作而无法生成的表格: Alice 0/1 Billy 1/1 Carol 0/1 Daffyd 0/0 Alice 2/3 Billy 0/1 Carol 0/0 Daffyd 0/0 Alice 1/1 Billy 0/2 Carol 2/2 Daffyd 0/1 给定一个表,我们如何有效地确定它是否有效?我们可以从以下几点开始: 名称的顺序无关紧要,因为我们忘记了原始的起始顺序。 获胜总数应为比赛总数的一半。(这表明上面的第一个示例无效。) …

3
为什么选择排序比气泡排序快?
维基百科上写道:“ ...选择排序几乎总是胜过气泡排序和侏儒排序。” 任何人都可以向我解释为什么选择排序比气泡排序更快的原因,尽管它们都具有: 最坏情况下的时间复杂度:Ø( ñ2)O(n2)\mathcal O(n^2) 比较数: Ø( ñ2)O(n2)\mathcal O(n^2) 最佳案例时间复杂度: 气泡排序:O(n )O(n)\mathcal O(n) 选择排序:Ø( ñ2)O(n2)\mathcal O(n^2) 平均案件时间复杂度: 气泡排序:Ø( ñ2)O(n2)\mathcal O(n^2) 选择排序:Ø( ñ2)O(n2)\mathcal O(n^2)

2
为什么C的void类型不同于Empty / Bottom类型?
维基百科以及我发现的其他来源都将C的void类型列为单位类型,而不是空类型。我觉得这很混乱,因为在我看来,它void更适合于空/底类型的定义。 void据我所知,没有价值观存在。 返回类型为void的函数指定该函数不返回任何内容,因此只能执行某些副作用。 类型的指针void*是所有其他指针类型的子类型。同样,void*在C中进行来回转换是隐式的。 我不确定最后一点是否可以作为void空类型的参数,void*或多或少是与无关的特例void。 另一方面,void它本身不是所有其他类型的子类型,据我所知,这是将类型作为底部类型的要求。
28 type-theory  c  logic  modal-logic  coq  equality  coinduction  artificial-intelligence  computer-architecture  compilers  asymptotics  formal-languages  asymptotics  landau-notation  asymptotics  turing-machines  optimization  decision-problem  rice-theorem  algorithms  arithmetic  floating-point  automata  finite-automata  data-structures  search-trees  balanced-search-trees  complexity-theory  asymptotics  amortized-analysis  complexity-theory  graphs  np-complete  reductions  np-hard  algorithms  string-metrics  computability  artificial-intelligence  halting-problem  turing-machines  computation-models  graph-theory  terminology  complexity-theory  decision-problem  polynomial-time  algorithms  algorithm-analysis  optimization  runtime-analysis  loops  turing-machines  computation-models  recurrence-relation  master-theorem  complexity-theory  asymptotics  parallel-computing  landau-notation  terminology  optimization  decision-problem  complexity-theory  polynomial-time  counting  coding-theory  permutations  encoding-scheme  error-correcting-codes  machine-learning  natural-language-processing  algorithms  graphs  social-networks  network-analysis  relational-algebra  constraint-satisfaction  polymorphisms  algorithms  graphs  trees 

1
顺序前,顺序后和顺序中的哪些组合是唯一的?
我们知道订单, post L(x) => [x] post N(x,l,r) => (post l) ++ (post r) ++ [x] 和预购 pre L(x) => [x] pre N(x,l,r) => [x] ++ (pre l) ++ (pre r) 和有序遍历 顺序化。 in L(x) => [x] in N(x,l,r) => (in l) ++ [x] ++ (in r) 即使我们假定成对的不同键/标签,也可以很容易地看出它们都不是唯一描述给定的树。 为此可以使用这三种的哪些组合,哪些不能使用? 肯定的答案应该包括(有效的)算法来重建树,并证明(正确的)原因。否定答案应提供反例,即具有相同表示形式的不同树。

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.