多重集
多重集(multiset)是一种数学概念,它扩展了集合的概念,允许集合中的一个元素出现多次。在标准的集合(set)中,每个元素仅能出现一次,而在多重集中, 每个元素可以重复出现多次(元素的排列顺序并不重要)。对于任一多重集S,其中元素x的重度(multiplicity),即x在S中的出现次数,用符号S(x)来表示。
闵可夫斯基和
闵可夫斯基和(Minkowski sum)对于两个多重集s1和s2而言,就是从S1和S2中取所有可能的值相加,表示为S1⊕S2=s1+s2:s1∈S1,s2∈S2。
闵科夫斯基差
相应的,闵科夫斯基差(Minkowski difference)对于两个多重集s1和s2而言,就是从S1和S2中取所有可能的值相减,表示为S1⊖S2=s1-s2:s1∈S1,s2∈S2。
谱卷积
如果两个多重集表示两次从两种肽中提取的简化光谱,S1⊖S2被称为S1和S2的谱卷积(spectral convolution),共有的峰值数由(S2⊖S1)(0)表示。
给定:两个由正实数组成的多重集,每个集合的大小最大为200。
输出:S1⊖S2的最大重数,以及使(S2⊖S1)(x)最大的x的绝对值(如果有多个结果,返回一个即可)。
示例输入:
186.07931 287.12699 548.20532 580.18077 681.22845 706.27446 782.27613 968.35544 968.35544
101.04768 158.06914 202.09536 318.09979 419.14747 463.17369
示例出:
3
85.03163
本问题比较简单,只需要两重循环将两个集合元素相减计数。需要注意的是结果保留小数点后五位。
with open("rosalind_conv.txt") as f:
content = f.readlines()
a = content[0].strip()
b = content[1].strip()
alist = [float(i) for i in a.split(" ")]
blist = [float(i) for i in b.split(" ")]
ab = []
for i in alist:
for j in blist:
ab.append(round(i-j,5))
cobj = dict(Counter(ab))
maxcount = max(cobj.values())
print(maxcount)
for k in cobj:
if cobj[k] == maxcount:
print(k)
break
假设有两张质谱图,想检查它们是否都是从同一种蛋白质中获得的。这需要需要一些质谱相似性的概念。 最简单的度量方法是计算质谱中共享的峰的数量,称为共享峰数。 简化质谱的类似方法是计算两个质谱共有的质量数。 共享峰数在最简单的情况下是有用的,但如果一个质谱对应的肽包含在另一个质谱中,而第二个质谱是从另一个 质谱中获得的,那么共享峰数就帮不上忙了。 在这种情况下,两个光谱非常相似,但共享峰数却很小。 但是,如果我们将一个光谱向右或向左移动,那么共享峰就会对齐。 在简化光谱的情况下,这意味着存在某个偏移值x,这样将x加入一个光谱中每个元素的权重,就会在另一个光谱中产生大量匹配。