Tag: 算法

哪个是找到素数最快的算法?

哪个是用C ++查找素数的最快算法? 我已经使用sieve的算法,但我仍然希望它更快!

具有优先级的等式(表达式)解析器?

我使用一个简单的堆栈算法开发了一个方程式解析器,该算法将处理二元(+, – ,|,&,*,/等)运算符,一元(!)运算符和括号。 然而,使用这种方法,我会留下所有具有相同优先级的东西 – 无论运算符如何,都会从左向右进行评估,但优先级可以使用括号来强制执行。 所以现在“1 + 11 * 5”返回60,而不是人们所期望的。 虽然这是适合当前的项目,我想有一个通用的例程,我可以用于以后的项目。 为清晰起见编辑: 什么是优先解析方程的好算法? 我感兴趣的是一些简单的实现和理解,我可以自己编码,以避免授权问题与可用的代码。 语法: 我不明白这个语法问题 – 我手写的。 这很简单,我没有看到YACC或野牛的需要。 我只需要用“2 + 3 *(42/13)”这样的等式来计算字符串。 语言: 我在C中这样做,但我对算法感兴趣,而不是语言特定的解决方案。 C足够低,在需要时很容易转换成另一种语言。 代码示例 我发布了我上面提到的简单表达式解析器的测试代码 。 项目需求改变了,所以我从来不需要优化性能或空间的代码,因为它没有被纳入到项目中。 这是在原来的冗长的形式,应该是容易理解的。 如果我在运算符优先级方面做了进一步处理,我可能会选择这个宏,因为它与简单程序的其余部分相匹配。 如果我曾经在一个真实的项目中使用过这个功能,那么我会选择一个更紧凑,更快速的解析器。 相关的问题 数学解析器的智能设计? -亚当

在C 中最有效的位反转算法(从MSB-> LSB到LSB-> MSB)

什么是最好的算法来实现以下内容: 0010 0000 => 0000 0100 转换是从MSB-> LSB到LSB-> MSB。 所有位必须颠倒; 也就是说,这不是端到端的交换。

快速平方平方计算

为了加速我的数字divisons,我需要加速对bigint的操作y = x ^ 2,表示为无符号DWORD的动态数组。 要清楚: DWORD x[n+1] = { LSW, ……, MSW }; 其中n + 1是使用的DWORD的数量 所以数值x = x [0] + x [1] << 32 + … x [N] << 32 *(n) 问题是: 如何在没有精确度损失的情况下尽可能快地计算y = x ^ 2? – 使用C ++和整数算术(32位与进位)。 我目前的做法是应用乘法,y = x * x,并避免多重乘法。 例如: x = x[0] + x[1]<<32 + … […]

如何使用Telegram API实现授权?

我想要使​​用PHP来实现与电报REST API交互的多重授权。 我想要解决什么任务? 好吧,这很简单:几十个用户(他们都有一个像这里(+10,-2,+1000等)与相关组分类:网站管理员和客户)在我的网站上有一个用户配置文件。 当他们达到一定数量的carma,并且由于他们在他们的个人资料被授权,他们被加入基于自动生成的电报私人聊天。 经过一番调查,我发现这很复杂,因为: 我从来没有过硬件绑定社交网络的API实现经验。 我查看了https://core.telegram.org/api/auth ,但是如何使用PHP或任何其他语言来实现这些功能(例如auth.sendCode)是完全不明显的。 如果这些命令应该作为JSON发送到服务器,那么它看起来不像JSON: auth.sentCode#efed51d9 phone_registered:Bool phone_code_hash:string send_call_timeout:int is_password:Bool = auth.SentCode; 它是什么? 它写的是哪种语言? UPD:它是用TL(类型语言)编写的: https : //core.telegram.org/mtproto/TL 我已经探索了几个客户端的源代码(网络图,Telegram-Cli(tg),tdesktop),并且发现了https://core.telegram.org/mtproto 不幸的是,他们中没有一个支持多方授权,经过一点研究,我不知道要在哪里深入挖掘以获取更多信息。 另外,这些实现看起来很笨重和复杂(例如https://github.com/vysheng/tg ): 在那里我看到一堆服务器(./tg/tgl/tgl.h): #define TG_SERVER_1 "149.154.175.50" #define TG_SERVER_2 "149.154.167.51" #define TG_SERVER_3 "149.154.175.100" #define TG_SERVER_4 "149.154.167.91" #define TG_SERVER_5 "149.154.171.5" 我发现了几个可能适当的函数(./tg/tgl/queries.c): void empty_auth_file (void) { if (TLS->test_mode) { bl_do_dc_option (TLS, 1, "", […]

计数数组中的倒数

我正在设计一个算法来执行以下操作:给定数组A[1… n] ,对于每个i < j ,找到所有的反转对,使得A[i] > A[j] 。 我正在使用合并排序和复制数组A到数组B,然后比较这两个数组,但我很难看到我可以如何使用这个找到倒数的数目。 任何提示或帮助将不胜感激。

数组的排列

例如,我有这个数组: int a[] = new int[]{3,4,6,2,1}; 我需要列出所有的排列,如果这样的话, {3,2,1,4,6} ,其他的不能相同。 我知道,如果数组的长度是n,那么就有n! 可能的组合。 这个算法怎么写? 更新:谢谢,但我需要一个伪代码算法,如: for(int i=0;i<a.length;i++){ // code here } 只是算法。 是的,API函数很好,但是对我来说并没有太大的帮助。

圆线段碰撞检测算法?

我有一条从A到B的圆和一个位于C的半径为R的圆。 什么是一个好的算法来检查线条是否与圆相交? 沿着圆周边缘的哪个坐标发生?

简单的英语中的Ukkonen后缀树算法

这一点我感觉有点厚。 我已经花了好几天的时间想把自己的头完全包裹在后缀树的构造中,但是因为我没有数学背景,所以很多的解释都是在我开始过度使用数学符号的时候解决的。 最接近我找到的一个很好的解释是使用后缀树的快速字符串搜索 ,但是他掩盖了不同的点,算法的某些方面仍然不清楚。 我相信,在这里Stack Overflow的这个算法的一步一步的解释对于除了我之外的其他许多人来说是非常宝贵的。 作为参考,这里是Ukkonen关于算法的论文: http : //www.cs.helsinki.fi/u/ukkonen/SuffixT1withFigs.pdf 到目前为止,我的基本理解是: 我需要迭代给定字符串T的每个前缀P. 我需要遍历前缀P中的每个后缀S并将其添加到树中 为了给树添加后缀S,我需要遍历S中的每个字符,迭代包括沿着一个以S中相同的一组字符C开始的现有分支,并且当我将一个边分割为后代节点时在后缀中达到不同的字符,或者如果没有匹配的边缘可以走下去。 当发现没有匹配的边缘向下走向C时,为C创建新的叶边。 基本算法似乎是O(n 2 ),正如在大多数解释中指出的那样,因为我们需要遍历所有的前缀,那么我们需要遍历每个前缀的每个后缀。 由于使用了后缀指针技术,Ukkonen的算法显然是独一无二的,尽管我认为这是我无法理解的。 我也无法理解: 确切何时以及如何分配,使用和更改“活动点” 算法的标准化方面正在发生什么 为什么我看到的实现需要“修复”他们正在使用的边界变量 这里是完整的C#源代码。 它不仅能够正常工作,而且支持自动封装,并呈现更好看的输出文本图形。 源代码和示例输出位于: https://gist.github.com/2373868 更新2017-11-04 多年以后,我发现了后缀树的新用法,并在JavaScript中实现了这个算法。 Gist在下面。 它应该是无bug的。 将其转储到一个js文件中, npm install chalk从相同位置npm install chalk ,然后使用node.js运行以查看一些丰富多彩的输出。 在同一个Gist中有一个精简的版本,没有任何的调试代码。 https://gist.github.com/axefrog/c347bf0f5e0723cbd09b1aaed6ec6fc6

从1-5到1-7扩展一个随机范围

给定一个在1到5范围内产生一个随机整数的函数,编写一个函数来产生一个在1到7范围内的随机整数。 什么是简单的解决方案? 什么是有效的解决方案来减少内存使用量或在较慢的CPU上运行?