- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我下面的问题是 NP 完全问题,但是,我试图找到至少稍微快一点的字符串搜索函数或模块,与现在相比,它可能有助于减少一些计算时间。如有任何建议,我们将不胜感激。
连接的(最长可能的)超字符串是:
AGGAGTCCGCGTGAGGGAGGTGTAGTGTAGTGG
下面的代码产生了 16 米的最短超串:
CCGTAGGTGGAGT
import itertools as it
def main():
seqs = ['AGG', 'AGT', 'CCG', 'CGT', 'GAG', 'GGA', 'GGT', 'GTA', 'GTG', 'TAG', 'TGG']
seq_perms = [''.join(perm) for perm in it.permutations(seqs)]
for i in range(0, len(''.join(seqs))):
seq_perms = [''.join(perm)[:i] for perm in it.permutations(seqs)]
for perm in seq_perms:
if all(perm.find(seq) != -1 for seq in seqs) == True:
print 'Shortest superstring containing all strings:\n{}'.format(perm)
return
if __name__ == '__main__':
main()
任何在我的系统上以更短时间完成的重构都将被标记为已解决。
最佳答案
我应用了 Dijkstra 算法(宽度搜索),并在不到一秒的时间内找到了解决此任务的方法。我在内存使用方面对其进行了一些优化,但我认为就算法而言,这是一种比其他答案中的方法更好的方法。除非我们用完内存,否则这应该是一个更好的解决方案。
from collections import defaultdict
def dijkSuperstring(originalSeqs):
paths = defaultdict(set)
paths[0] = { '' }
while paths:
minLength = min(paths.keys())
while paths[minLength]:
candidate = paths[minLength].pop()
seqAdded = False
for seq in originalSeqs:
if seq in candidate:
continue
seqAdded = True
for i in reversed(range(len(seq)+1)):
if candidate.endswith(seq[:i]):
newCandidate = candidate + seq[i:]
paths[len(newCandidate)].add(newCandidate)
if not seqAdded: # nothing added, so all present?
return candidate
del paths[minLength]
print dijkSuperstring(
[ 'AGG', 'AGT', 'CCG', 'CGT', 'GAG', 'GGA', 'GGT', 'GTA', 'GTG', 'TAG', 'TGG' ])
我还尝试使用随机序列作为输入:
seqs = [ ''.join(random.choice('GATC')
for i in range(3))
for j in range(11) ]
print dijkSuperstring(deqs)
我很快发现求解时间在很大程度上取决于结果的大小 (!) 而不是输入的大小(因此它不可预测)。这并不奇怪,但它使得比较不同的算法有点困难,因为其他算法不一定也具有此属性。特别是,OP 中的序列集似乎构成了一个相对轻量级的问题。其他由 3 个字符组成的 11 个序列的集合更难解决。
所以我做了一些统计测量;我解决了 1000 组 8 个序列。这是我为 3 个和 4 个字符的序列所做的。然后我将持续时间分为 100 组(从 0 到最高持续时间等间隔)并计算每组有多少人。为了平滑图形,我总是使用三个相邻组的总和。
下图分别显示了两个这样的实验,使用我的算法的早期(未优化)版本执行(但曲线的形状与现在相同);我做了两次,至少知道图中的一条奇怪的沟渠是有原因的还是纯属偶然。
我有兴趣看到其他算法的同类输入的类似图表。这可能很有趣,因为我的算法显然存在内存问题。由于内存耗尽,解决 11 个 3 个字符的序列使我的机器停顿了好几次,因此即使速度较慢,使用另一种算法也是有意义的。
关于python - 最短超串搜索的更有效算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20071702/
在C#中,我可以通过base关键字访问基类,在java中,我可以通过super关键字访问它。在delphi中如何做到这一点?假设我有以下代码: type TForm3 = class(TF
在这件事上我已经把头撞到墙上好几次了。所以我希望在正确的方向上得到一点帮助。 我有一张 table ,上面有订单,一张 table 上有火车,一张 table 上有航类,一张 table 上有巴士。每
在 Python 中,假设我有以下代码: class SuperClass(object): def __init__(self, x): self.x = x
我希望这个 subview 扩展到它的父 View 之外,但是父 View 的边框正在切入 subview 。有没有办法防止这种情况? class TheView : UIView { let
我有一个标准的高斯函数,看起来像这样: def gauss_fnc(x, amp, cen, sigma): return amp * np.exp(-(x - cen) ** 2 / (2
例如,我有下一个类,带有有界类型参数: public class ItemContainer { void addItems(List items); } 在另一个带有参数的类中使用: pub
如何将此设置转换为命令? 结果如下: // Manual Compression (see the image above) Compressed Size: 12,647,451 bytes //
请建议在应用继承时如何使用@Wither/@With。 我有一个抽象类Parent和具体的Child。 Child 应该是不可变的。将 @Wither 放在两者上会给我两个错误: 构造函数 Child
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在尝试向服务器(虚拟托管)发出 HTTP2 请求,该服务器根据主机 header 值 (SNI) 提供 SSL 证书。 # conn = hyper.HTTP20Connection('h
我有一个应用程序,必须将大约 1300 万行、大约 10 个平均长度的字符串插入到嵌入式 HSQLDB 中。我一直在调整一些东西(批量大小、单线程/多线程、缓存/非缓存表、MVCC 事务、log_si
我想定义一个函数f(x, t::Type)根据 isa(x, t) 是否执行不同的行为.假设我想调用b1(x)如果是,b2(x)除此以外。 我知道我可以像这样在运行时进行动态检查: function
我正在使用 Hyper-V WMI Provider在 Hyper-V 中导入虚拟机,特别是使用 ImportVirtualSystemEx Msvm_VirtualSystemManagementS
这几个星期以来一直困扰着我,我没有结束对它的研究,因为我目前重载并且它让我落后于第一年的 CS (opengl) 大学类(class),这首先让我研究了这个:如何只用一个 for 循环绘制立方体的所有
我正在我的计算机(操作系统:Windows 8)上开发一个 WP8 应用程序。我需要安装一个 VM 才能拥有 linux。同时我需要使用我的 Windows Phone 模拟器。 我下载了 VMWar
我是一名优秀的程序员,十分优秀!