Tag: algorithm

加快在Python中将string配对成对象

我试图find一种有效的方法将包含整数点的数据行组合在一起,并将它们存储为Python对象。 数据由X和Y坐标点组成,用逗号分隔的string表示。 如(x_1, y_1), (x_2, y_2), …等等必须配对,然后存储为一个对象列表,其中每个点是一个对象。 下面的函数get_data生成这个示例数据: def get_data(N=100000, M=10): import random data = [] for n in range(N): pair = [[str(random.randint(1, 10)) for x in range(M)], [str(random.randint(1, 10)) for x in range(M)]] row = [",".join(pair[0]), ",".join(pair[1])] data.append(row) return data 我现在的parsing代码是: class Point: def __init__(self, a, b): self.a = a self.b = b def […]

从容器中获取随机元素

从STL范围获得[伪]随机元素的好方法是什么? 我可以想出最好的做法是做std::random_shuffle(c.begin(), c.end()) ,然后从c.begin()取出我的随机元素。 不过,我可能需要一个来自const容器的随机元素,或者我可能不想要一个完整的shuffle的成本。 有没有更好的办法?

find第n个排列而不计算其他排列

给定一个代表置换primefaces的N个元素的数组,是否有这样的algorithm: function getNthPermutation( $atoms, $permutation_index, $size ) 其中$atoms是元素数组, $permutation_index是$permutation_index的索引, $size是置换的大小。 例如: $atoms = array( 'A', 'B', 'C' ); // getting third permutation of 2 elements $perm = getNthPermutation( $atoms, 3, 2 ); echo implode( ', ', $perm )."\n"; 将打印: B, A 没有计算每个排列直到$ permutation_index? 我听说了一些事实上的排列,但是我发现每个实现都给出了与V相同的排列,这不是我的情况。 谢谢。

最快的方式来扫描位stream中的位模式

我需要在比特stream中扫描16位字。 不保证在字节或字边界上alignment 。 什么是实现这个最快的方法? 有各种蛮力方法; 使用表和/或移位,但是有没有什么“bit twiddling shortcuts”,可以减less计算的数量,通过给yes / no /可能包含每个字节或单词的标志结果,因为它到达? C代码,内部函数,x86机器代码都会很有趣。

如何查找最大值 和分钟。 在数组中使用最小的比较?

这是一个面试问题:给定一个整数数组find最大值。 和分钟。 使用最小的比较。 显然,我可以遍历数组两次,并在最坏的情况下使用~2n比较,但我想做得更好。

在不使用临时variables的情况下交换两个variables

我希望能够在不使用C#中的临时variables的情况下交换两个variables。 可以这样做吗? decimal startAngle = Convert.ToDecimal(159.9); decimal stopAngle = Convert.ToDecimal(355.87); // Swap each: // startAngle becomes: 355.87 // stopAngle becomes: 159.9

碰撞检测的圈数很多

检查大量圈子的碰撞的最佳方法是什么? 检测两个圆之间的碰撞非常容易,但是如果我们检查每个组合,那么它就是O(n 2 ) ,这绝对不是最优解。 我们可以假设圆对象具有以下属性: 坐标 半径 速度 方向 速度是不变的,但方向可以改变。 我已经提出了两个解决scheme,但也许有一些更好的解决scheme。 解决scheme1 把整个空间分成重叠的方格,只检查同一方格中的圆。 方格需要重叠,所以当一个圆从一个方格移动到另一个方格时不会有问题。 解决scheme2 开始时需要计算每对圆之间的距离。 如果距离很小,那么这些对存储在一个列表中,每次更新都需要检查是否有冲突。 如果距离很大,那么在更新之后我们会存储一个碰撞(可以计算出来,因为我们知道距离和速度)。 它需要存储在某种优先级队列中。 之前计算的更新距离数量需要再次检查后,然后我们执行相同的程序 – 把它放在列表中或再次在优先级队列中。 马克·拜尔斯问题的答案 这是一款游戏吗? 这是为了模拟,但它也可以被视为一个游戏 你是否想每n毫秒重新计算一次新的位置,此时还要检查碰撞情况? 是的,更新之间的时间是恒定的。 你想find发生第一次/每次碰撞的时间? 不,我想find每一个碰撞,并发生“事情”发生。 准确度有多重要? 这取决于你的准确性是什么。 我需要检测所有的碰撞。 如果很小的快速移动的圈子偶尔可以相互传递,这是一个大问题吗? 可以认为速度很小,不会发生。

searchstring的有效方法

假设有一个文本stream(或Java中的Reader),我想检查一个特定的string。 文本stream可能非常大,所以一旦findsearchstring,我想返回true,并尝试避免将整个input存储在内存中。 天真地,我可能会尝试做这样的事情(在Java中): public boolean streamContainsString(Reader reader, String searchString) throws IOException { char[] buffer = new char[1024]; int numCharsRead; while((numCharsRead = reader.read(buffer)) > 0) { if ((new String(buffer, 0, numCharsRead)).indexOf(searchString) >= 0) return true; } return false; } 当然这不能检测给定的searchstring,如果它发生在1k缓冲区的边界上: search文本:“stackoverflow” 数据stream缓冲区1:“abc ……… stack” stream缓冲区2:“溢出……. xyz” 我怎样才能修改这段代码,使它正确地在缓冲区的边界上find给定的searchstring,但没有将整个stream加载到内存中? 编辑:注意当为一个stringsearchstream时,我们试图最小化从stream中读取的数量 (以避免networking/磁盘中的延迟),并保持内存使用恒定,而不pipestream中的数据量如何。 string匹配algorithm的实际效率是次要的,但很明显,find使用这些algorithm中更高效的解决scheme将是很好的。

检查一个拼写的数字是否在C ++的范围内

我想检查(数字)input与范围列表(最小,最大),而部分inputinput; 换句话说,我需要一个优雅的algorithm来检查一个数字的前缀与范围(不使用正则expression式)。 样本testing案例: 1 is in ( 5, 9) -> false 6 is in ( 5, 9) -> true 1 is in ( 5, 11) -> true (as 10 and 11 are in the range) 1 is in ( 5, 200) -> true (as eg 12 and 135 are in the range) 11 is in […]

algorithm难题面试

我find了这个面试问题,我不能提出比O(N ^ 2 * P)更好的algorithm: 给定P个自然数(1,2,3,…,P)的向量和另一个长度为N的元素来自第一个向量的向量,find第二个向量中最长的子序列,使得所有元素均匀分布(具有相同的频率)。 例如:(1,2,3)和( 1,2,1,3,2,1,3,1,2,3,1 )。 最长的子序列在[2,10]区间中,因为它包含了第一个序列中具有相同频率的所有元素(1次出现3次,2次3次,3次3次)。 时间复杂度应该是O(N * P)。