Questions tagged «algorithms»

在数学和计算机科学中,算法是一种有效方法,表示为用于计算函数的定义明确的指令的有限列表。算法用于计算,数据处理和自动推理。

3
是否可以在不使用%运算符的情况下实现分布良好的哈希表?
我希望在C#中实现一个快速,分布均匀的哈希表。我在选择需要任意哈希码并“约束”它的哈希约束函数时遇到麻烦,因此可以将其用于索引存储桶。到目前为止,有两种选择: 一方面,您可以确保存储桶中始终有素数个元素,而要限制哈希,您只需对存储桶数进行模运算即可。实际上,这就是.NET词典所做的。这种方法的问题在于,与其他操作相比,使用%的速度非常慢。如果您查看Agner Fog指令表,idiv(这是为%生成的汇编代码)对于较新的Intel处理器,其指令等待时间约为25个周期。与此相比,大约3 mul或1逐位OPS像and,or或xor。 另一方面,您可以使存储桶的数量始终为2的幂。您仍将必须计算哈希的模数,因此您不必尝试在数组外部进行索引,但这一次的开销较小。由于对于2的幂% N是& (N - 1),约束被减少到仅需要1-2个周期的屏蔽操作。这是由Google的sparsehashash完成的。缺点是我们指望用户提供良好的哈希值;屏蔽哈希基本上会切断一部分哈希,因此我们不再考虑哈希的所有位。如果用户的哈希值分布不均匀,例如仅填充了较高的位或较低的位始终相同,则此方法的冲突率就会高得多。 我正在寻找一种我可以使用的兼具两全其美的算法:它考虑了哈希的所有位,并且比使用%还要快。它不一定必须是模数,而是一定要保证在一定范围内0..N-1(其中N是铲斗的长度)并且在所有插槽中具有均匀的分布。是否存在这样的算法? 感谢您的帮助。

1
从原点向外产生最大边数为3的边和顶点的算法
我正在为一个网站创建2D游戏,在该网站上,宇宙可以变得非常大(基本上是无限大)。最初,宇宙由6个与原点(0,0)等距离的恒星组成。我的任务是能够生成更多的恒星,这些恒星将具有相互连接的“路径”(边缘)。如何设计满足以下限制的算法: 恒星是向外随机产生的。(例如,新星的(x,y)坐标将在所有方向上从(0,0)缓慢向外移动,最好采用螺旋格式) 边缘不会交叉。 尽管应该有一些差异,但新星不应与其他星相距太远或太近。(例如必须有一个最小半径) 星星/点的倍数不得超过3。 鉴于所有这些都将存储在数据库中,该算法不会太昂贵。换句话说,我很想达到O(n)的复杂度(我不知道这是否可行)。 本质上,我要寻找的是一个螺旋状的星系,其中的恒星是图形上的点,恒星之间的行进由这些恒星之间的边缘描绘。 我需要解决的特定步骤是: 在尚未重合3的其他恒星附近随机产生一个点。 查找尚未有多重度3且不会产生边缘冲突的第一颗恒星。 如果星形距离最小x单位,则在两点之间创建一条边。 我尝试寻找解决方案,但是我的数学技能(以及关于图论的知识)需要大量工作。此外,将不胜感激与此问题有关的任何资源/链接。 这是我在想的一些伪代码,但是我不确定这是否还能奏效,并且我确定在经过10,000次等运算后,它的性能将无法令人满意。 newStar = randomly generated (x, y) within radius of last star from origin while(newStar has not been connected): for (star in the known universe): if(distance between newStar and star > x units): if(star has < 3 multiplicity): …

5
比较三个数字的简单方法
我有一些代码,其中包含一系列if可以正常工作的,但是感觉很混乱。基本上,我想选择三个整数中最大的一个,并设置一个状态标志来说明选择了哪个。我当前的代码如下所示: a = countAs(); b = countBs(); c = countCs(); if (a > b && a > c) status = MOSTLY_A; else if (b > a && b > c) status = MOSTLY_B; else if (c > a && c > b) status = MOSTLY_C; else status = DONT_KNOW; 这种模式会发生几次,并且变量名较长,从视觉上确认每一个if都是正确的会有些困难。我觉得可能会有更好,更清晰的方法来执行此操作;有人可以建议什么吗? …
11 algorithms  c 

2
是否可以通过使用二进制搜索树进行单独链接来加快哈希表的速度?
我想使用二进制搜索树实现哈希表,以减少从O(n)(使用链表)到O(log n)(使用BST)的单独链接过程中的搜索复杂性。可以这样做,如果可以,怎么办?如果解决方案是逐步实施的,则逻辑将更容易理解。 我想减少哈希表中的“搜索”时间(使用单独的链接进行构建),但同时我不想增加插入时间。对于我的项目,我无法更改哈希函数以减少冲突。但是由于可伸缩性,冲突正在发生。我试图找到一种解决方法,以便在发生冲突的情况下以某种方式使用最佳访问并插入时间...即管理事物的当前状态,而不是重构整个算法。如果没有成功,则必须进行重组。有什么想法吗?

3
带有匹配起始和结束字母的单词的最长列表
我的朋友给我一个问题,他说这很简单,但是我想不出一个好的算法来实现。 系统会为您提供100个随机英语单词的输入。您必须找到最长的字符串,其中一个单词的最后一个字母与下一个单词的第一个字母匹配。每个单词只能使用一次。 例如,如果给您单词“ cat”,“ dog”,“ that”,则您可以输入的最长字符串将是“ cat-> that”。如果给您单词“ mouse”,“ moose”,“ unicorn”,则您可以输入的最长字符串将仅为一个单词(因为这些单词均未链接)。如果给您单词“ bird”,“ dish”,“ harb”,则最长的字符串可能是“ harb-> bird-> dish”(或“ dish-> harb-> bird”或“ bird- >菜-> harb”)。 我想到了将其建模为有向循环图的想法。每个节点只是一个单词,每个单词/节点的顶点都以该单词结尾的字母开头。 +-------+ \ +------+ | cat |-----------| that | +-------+ / +------+ | | \|/ | +-------+ / | | the |--------------+ +-------+ \ 这个问题似乎是最长路径搜索,即NP-Hard。 有更好的方法吗?甚至可以使用某种近似算法?还是采用某种方法来利用英语来减少搜索空间?
11 algorithms 

2
Facebook的广告出价系统如何运作
当您在Facebook上制作广告时,系统会为您提供“ 建议的出价 ”范围(例如$ 0.90-$ 2.15 USD)。根据此页面: 建议的出价范围可帮助您选择最高出价,从而使您的广告获得成功。它是基于有多少其他广告商竞相向与您相同的受众群体展示广告。 我有兴趣了解引擎盖下实际发生的情况(技术上)。 假设用户登录了Facebook。在服务器端,它处理了用户浏览器发送的HTTP请求(作为登录的一部分),服务器需要确定向用户显示哪个广告。 我认为这是“招标”系统起作用的地方?假设基于此用户的人口统计数据,以及根据几个竞争广告客户设计其广告系列所针对的受众群体,让我们假设Facebook看到有20种可能返回的不同广告。 这个出价系统如何帮助Facebook确定返回给客户端的20个广告中的哪个?我猜想“出价更高”的广告商会优先于“出价更低”的广告商。但是什么时候招标呢?广告客户需要多久重新竞标一次?出价约束多长时间? 一旦我了解了广告背后的这些与用法相关的概念,后端就会在以下哪种“选择策略”之间进行使用,这将是显而易见的: 轮循 优先轮循 随机(可疑) 基于历史 基于MVP 感谢能够帮助我指出正确方向并解释这些建议的出价系统及其工作原理的任何人。

5
以编程方式找到算法的Landau表示法(Big O或Theta表示法)?
我习惯于手动搜索我的算法的Landau(Big O,Theta ...)表示法,以确保它们已尽可能地优化,但是当函数变得真正又大又复杂时,它就在不断发展。手工做的时间太多。它也容易出现人为错误。 我花了一些时间在Codility(编码/算法练习)上,并注意到它们会为您提交的解决方案(时间和内存使用量)提供Landau表示法。 我想知道他们是怎么做到的...你会怎么做? 除了词法分析或代码解析之外,还有其他方法吗? 这个问题主要涉及PHP和/或JavaScript,但是我对任何语言和理论都开放。

4
生产软件中通用情况下的指数时间算法有多普遍?
我知道一般应避免使用指数时间算法,但有时是必须的。一个例子是旅行推销员。这种算法在生产软件中有多普遍?这些情况通常是必要的还是紧急工作的结果?我知道可以通过良好的启发式解决许多问题。那些不能做的人通常会做什么?
11 algorithms 

5
将24小时降水值列表转换为按小时总计
假设我有一个按小时排列的降水值列表,每个值都显示按日期排序的前24小时内发生了多少降雨。例如: { '2012-05-24 12:00': 0.5, // .5" of rain from 5/23 12:00 - 5/24 11:59 '2012-05-24 11:00': 0.6, // .6" of rain from 5/23 11:00 - 5/24 10:59 '2012-05-24 10:00': 0.6, // .6" of rain from 5/23 10:00 - 5/24 09:59 ... '2012-05-23 10:00': 0 } 是否有一项策略/算法来确定每个小时中的降雨量?我似乎无法解决这个问题。我知道这并不像对差异求和那样简单。 数据集的可视化 P(N) [.....======================] …

6
一次连接一个字符串效率低下吗?
我回想起用C语言进行编程的日子,当两个字符串连接在一起时,操作系统必须为连接的字符串分配内存,然后程序可以将所有字符串文本复制到内存中的新区域,然后旧内存必须手动进行被发布。因此,如果像加入列表一样多次执行此操作,则OS必须不断分配越来越多的内存,只是要在下一个串联后释放它。用C语言执行此操作的更好方法是确定组合字符串的总大小,并为整个连接的字符串列表分配必要的内存。 现在,在现代编程语言(例如C#)中,我通常会看到遍历集合的内容,方法是遍历集合并将所有字符串一次全部添加到单个字符串引用中。即使具有现代计算能力,这也不低效吗?

7
如果您的算法是正确的,那么您花了多长时间编写它是否重要?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我最近发现,Facebook面临编程方面的挑战,如果正确完成,您将自动获得电话面试。 有一个示例挑战,要求您编写一种可以解决“河内之塔”类型问题的算法。给定许多钉子和圆盘,进行初始和最终配置;您的算法必须确定可能的最少步骤,以进行最终配置并输出步骤。 该示例挑战为您提供了45分钟的时间限制,但允许您仍然测试您的代码,以查看时间限制是否过期。 我不知道有什么可爱的数学解决方案可以解决该问题,而且我也不想寻找一个数学解决方案,因为我认为这样做会很欺骗。因此,我试图独自解决最大的挑战。 我能够制定出行之有效的算法。但是,我花了4个多小时才完成制作,比45分钟的要求要长得多。由于花费的时间比分配的时间长得多,因此我没有尝试实际的挑战。 这让我感到奇怪,实际上,花了我这么长时间真的很重要吗?我的意思是这表明我将无法在这样的地方(不仅是Facebook,而且是Google,Fog Creek等)找到工作,需要降低自己的抱负,或者我实际上已经过世了在我的第一次尝试上,即使花了太长时间才被认为是好的?
11 algorithms 

6
如何教一个脚本来发现讽刺?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我当前正在构建一个有趣的脚本,该脚本基本上匹配给定的短语并根据匹配点给出预定义的响应。您可以要求它根据实时供稿检索一些信息,运行任务,讲述轶事或只是与她聊天。 我已经有内置的badwords和/或大写锁定检测功能。该程序有一个女孩的名字,我尝试从逻辑上讲尽可能接近一个女孩(例如:每个人都知道,大多数女孩花700ms来回答一个问题,当然是在开玩笑)。所以这是一个小例子: 客户:您有什么问题? 菊:不要使用与我同色的东西! 客户:####您 菊久:您为什么对我这么刻薄:/ 但是,我真的很想添加讽刺功能。因此,如果您用讽刺的方式写东西,那么她会发现并做出相应的回应。现在这是一个棘手的部分,您如何教脚本,什么是讽刺? 对我来说更具体。今天最常用的讽刺单词是什么?还是如何获得该统计数据?如何使脚本理解给定短语的上下文? 更新 由于这个问题引起了很多炒作,我认为应该多清理一些事情。很清楚,使脚本完全检测讽刺基本上是不可能的。至少在合理的事情上。但是,我确实相信可以发现一些可能的讽刺。 目前为止,我的脚本可以检测到非常有限的讽刺。我预定义了一些常见的讽刺词(但是,仅它们是无用的。)例如:诸如此类,是的,正确而伟大。然后首先匹配简单的东西,例如大写和quoted:THANKS you are so smart或oh you are so "SMART"。 由于脚本的主要功能是执行任务或检索信息,而后记它将询问您的意思。然后我想,添加“谢谢”作为特殊变量。因此yeah thanks还是whatever thanks触发了可能的讽刺,脚本将询问您:“我是否检测到讽刺?” 最好的选择就是说“对不起”,否则它将添加一个警告点,如果达到限制,它将开始无视您。 由于这些非常简单的算法似乎可以实际工作,因此,当然,在进行大量调整和调整之后,这种想法才有希望。但是,有很多人会更聪明地制作出具有相同想法的开源软件。然后,可以将此功能连接到Web上的许多功能。客户服务可能会最大程度地受益,但是,这种软件也可以用于检测“可疑”内容。


3
电梯算法及其实现
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 5年前关闭。 我想知道(真实的)电梯如何工作。但是到目前为止,我找不到关于它们使用的算法的太多材料,也找不到用于仿真的软件(如果有)。有人可以给我参考吗?

2
设计REST API的身份验证
我正在为将要生产和使用的REST服务设计API。我花了几天的时间试图弄清楚如何很好地处理身份验证,并认为我终于想出了一些办法。 我基于有关应用程序堆栈的以下事实提出此建议: 客户端和服务器位于.NET4中(客户端配置文件中的客户端部分) 服务器使用WCF REST公开 我真的不想在应用程序的内存中保留用户名和密码 从3开始,我想使用一种令牌身份验证的方式,以便在服务器验证了凭据之后,客户端将获得令牌以供整个应用程序的其余部分使用(这将使我能够做其他事情,例如使用户超时,并能够在网络版本和桌面版本之间无缝移动用户等)。在弄清楚如何使呼叫重播和防篡改之后,我提出了以下建议: 在客户端尝试进行身份验证之前,它会使用ECDiffieHellmanCng该类生成Diffie-Hellman密钥对。 它通过电线发送密钥对的公共部分以及用户名和密码(当然是通过HTTPS)。 服务器验证用户名/密码组合,如果成功,则执行以下操作: 创建一个唯一的会话令牌 生成自己的DH密钥对,并根据客户端提供的公共密钥计算共享密钥 记录其数据库中的会话令牌,共享机密,用户和“最后操作”时间(用于滚动到期窗口) 返回会话令牌,其公共DH密钥和身份验证成功消息 客户端从响应中获取DH密钥,计算共享密钥,并将令牌和密钥存储在内存中。 从那时起,会话令牌/秘密组合的工作方式与大多数其他REST API一样,对请求进行了指纹识别和时间戳记,然后生成了某种HMAC。每当客户端对服务器执行操作时,客户端都会检查令牌/秘密对,并允许该操作有效且未过期,并更新会话中的最后一个操作记录。 我看不到任何明显的缺陷,并且为此可能过度设计了,但是我需要在某个时候学习如何做到这一点。HMAC可以防止重放攻击,DH协商可以防止MITM攻击(我想不到在HMAC / DH之间可以进行有效的攻击)。 任何人都可以在此戳戳?

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.