Tag: algorithm

遗传algorithm资源

最近我对遗传algorithm的话题感兴趣,但是我找不到任何好的资源。 如果你知道任何好的资源,书籍或网站,我将不胜感激。 我对algorithm和人工智能拥有丰富的知识,但是我正在寻找一些在遗传编程方面有很好介绍的东西。

出于好奇:如何生成序列号? 提示,algorithm?

我想知道序列号生成器和validation器是如何工作的。 我的目标是生成一个只有数字和字母组成的序列号。 我喜欢编码作为一种爱好,不会称自己是一个专业程序员。 不过,我对这些有趣的function是如何在技术上起作用以扩大我的想法非常感兴趣。 任何提示,经验或书面algorithm表示赞赏。

在C ++中使用密钥更新使用最小优先级队列的最简单的方法

有时候在编程竞赛等时候,我们需要一个简单的最小优先级队列的实现,用reduce-key来实现Dijkstraalgorithm等等。我经常使用set <pair <key_value,ID>和一个数组(映射ID – > key_value )一起来实现这一点。 将元素添加到集合需要O(log(N))时间。 要从N个元素中构build优先级队列,我们​​只需将它们逐个添加到集合中。 这总共需要O(N log(N))时间。 具有min key_value的元素只是该集合的第一个元素。 探测最小的元素需要O(1)次。 删除它需要O(log(N))时间。 为了testing一些ID = k是否在集合中,我们首先在数组中查找它的key_value = v_k,然后search集合中的元素(v_k,k)。 这需要O(log(N))时间。 为了将一些ID = k的key_value从v_k改为v_k',我们首先在数组中查找它的key_value = v_k,然后search该集合中的元素(v_k,k)。 接下来,我们从集合中删除该元素,然后将元素(v_k',k)插入集合中。 然后,我们也更新数组。 这需要O(log(N))时间。 虽然上述方法可行,但大多数教科书通常build议使用二进制堆实现优先级队列,因为构build二进制堆的时间只是O(N)。 我听说在C ++的STL中有一个使用二进制堆的内置优先级队列数据结构。 但是,我不知道如何更新该数据结构的key_value。 在C ++中使用密钥更新来使用最小优先级队列的最简单和最有效的方法是什么?

有效地获得给定数量的所有因数

根据这个post ,我们可以通过下面的代码得到一个数字的所有因数。 for (int i = 1; i <= num; ++i){ if (num % i == 0) cout << i << endl; } 例如, 24号的除数是1 2 3 4 6 8 12 24 。 在search了一些相关的post后,我没有find任何好的解决scheme。 有没有什么有效的方法来完成这个? 我的解决scheme 通过这个解决scheme找出给定数字的所有主要因素。 获取这些主要因素的所有可能的组合。 但是,这似乎不是一个好的。

“为”循环第一次迭代

问候pyc-sires和py-ladies,我想问一下在第一次循环迭代中是否有一个优雅的pythonic方法来执行一些函数。 我能想到的唯一可能性是: first = True for member in something.get(): if first: root.copy(member) first = False else: somewhereElse.copy(member) foo(member)

为什么使用二进制search,如果有三元search?

我最近听说三元search,我们把一个数组分成3个部分进行比较。 这里会有两个比较,但它将数组减less到n / 3。 为什么人们不用这么多?

sortingalgorithm稳定的好处是什么?

一个sorting被认为是稳定的,如果它保持相同的键元素的顺序。 我想我的问题是,维持这个相对顺序的好处是什么? 有人可以举个例子吗? 谢谢。

代码应该多复杂?

我正在研究可以帮助我编写更小但更复杂的代码的algorithm。 我没有写150行if-else语句,而是devise了一个20行的algorithm。 问题是很多这些algorithm可能很复杂,需要大量的math来理解它们。 我也是唯一一个了解他们的人。 为了代码的可维护性,像其他人一样编写代码会更好吗?还是使用algorithm更好?

x86上的C 64位循环性能

我需要使用原始套接字的一些IPv4 ICMP处理代码的Internet Checksumfunction(补码校验和),并且我无法解释在64位英特尔处理器(使用gcc 4.8.2)上无法解释的行为。 我想知道是否有人可以说明一点。 我使用32位累加器实现了第一个校验和function,并执行了16位和。 然后我使用64位累加器和32位和来实现,认为总和越less,执行速度越快。 结果是第一个实现的运行速度是第二个的两倍(使用O3优化)。 我简直不知道为什么… 下面的代码实际上并没有执行准确的校验和(我简化了它),但是说明了这个问题。 两者都编译为在64位本机平台上运行的64位(LP64:短16位,整型32位,长64位,指针64位)。 32位累加器和16位和 unsigned short cksum_16_le(unsigned char* data, size_t size) { unsigned short word; unsigned int sum = 0; unsigned int i; for(i = 0; i < size – 1; i += 2) sum += *((unsigned short*) (data + i)); sum = (sum & 0xffff) + […]

find图像中最大的凸面黑色区域

我有一个这是一个小切口的图像: 正如你所看到的,它是黑色背景上的白色像素。 我们可以在这些像素(或更好的点)之间绘制虚线。 用这些线我们可以把区域。 我怎样才能find这个图像中不包含白色像素的最大的凸面黑色区域? 这里是一个小手绘的例子,我的意思是最大的凸面黑色区域: PS:图像不是噪音,它表示水平排列的低于10000000的素数。