的非重疊子串的隨機取樣給定長度Ñ的字符串,如何將I(僞)隨機抽樣米子大小的ķ使得沒有采樣串的重疊?我的大部分腳本編程經驗都是用Perl編寫的,但是使用任何通用語言的一個易於運行的解決方案就足夠了。長度爲k
長度爲k
回答
如果有一個字符不能在輸入中出現, X
,只是:
my $size = 20;
my $count = 20;
my $mark = 'X';
my $input = 'CCACGCATTTTTGTTCATTGTTCTGGCTTCTTACAAGGTTCAGTAGACTTTGTAACACAGTTGTGTCTCTCACAGATTGGCAGATGTTTGGTAAAGGATTGACTTTTCAGCCAACTCATGGGAAAGTGAAATAATGTAAAAAACAGGAAGAATACAGTTTTAGGCCTTTCAAGTGAGGCATGGCTTTCAGCTCTTGGCAAGAACAGGCAAGGAGATGCAAGTTTTAGGACTCTAAGAGGCTAGGCTTTTCAAAGTGCTTCTCTCCCCTTCACCCTCCTTCAGTTACAGCACCAAGCACCACCGAGGTGTTACCTGCAGCCTCACTCTCTACCTGGTTGTGGGATCCTGCCACTTCCTTAACCCACACTGAGTTCCTTGTGGTTCACAGGGTCACACAGAGGGCTGTAGAGATACAAAAGATATATGTGATTTTATATCACCTATCATATGAAGATATATTTATAAAATAGGAAACATATTAACCACTTATCATTTTATATATTTATGGTTTTATGTGTCAAAAATATATTGTTTCATGTATGTATTAAAGGATAAGTATGTATAAGAGGTTTTATAGATGTGTAAAATTATATATTTATACGTATCTTTACAAATTTAAGAATAAAGGAAGGAAAATTCTCAAAGAGGAATTCAGATATCAAGCAGTGCCCTTTGACCAAGAGCCTTGGTTACAACATACCTACAAAAGTGAACTATCATTGAAAGACCTATGGACACTGGATTTCTCTTTCCTTATTTAGAAGGGCAGTCTGTGTCTTGGAAAAGCATACAGTTTGTTGTATCTTGCTGGACAACAGGAGTCA';
if (2*$size*$count-$size-$count >= length($input)) {
die "selection may not complete; choose a shorter length or fewer substrings, or provide a longer input string\n";
}
my @substrings;
while (@substrings < $count) {
my $pos = int rand(length($input)-$size+1);
push @substrings, substr($input, $pos, $size, $mark x $size)
if substr($input, $pos, $size) !~ /\Q$mark/;
}
非常清楚和簡單的答案。但有一個問題,正則表達式中'\ Q'的目的是什麼? –
看起來它也有一個相當公正的分佈:http://i.imgur.com/EPLexRr.png。 –
以防您將$標記設置爲'|'之類的內容。是的,這應該是沒有偏見的(但是如果你要採取比這一串更多的話,甚至拒絕嘗試) – ysth
這是一個Python中的遞歸方法。在每一步中,從字符串的剩餘分區中隨機選擇,然後從所選分區中隨機選擇長度爲k的子字符串。將此分區替換爲所選子字符串上分區的分割。濾除長度小於k的分區,然後重複。當有m個子字符串時,子字符串列表會返回,或者沒有剩餘長度大於或等於k的分區。
import random
def f(l, k, m, result=[]):
if len(result) == m or len(l) == 0:
return result
else:
if isinstance(l, str):
l = [l]
part_num = random.randint(0, len(l)-1)
partition = l[part_num]
start = random.randint(0, len(partition)-k)
result.append(partition[start:start+k])
l.remove(partition)
l.extend([partition[:start], partition[start+k:]])
return f([part for part in l if len(part) >= k], k, m, result)
- 1. 長度爲k
- 2. 打印長度爲k
- 3. 序言:長度爲k的子集
- 4. 在圖中查找長度爲k的派系
- 5. 查找以K爲因子的最小長度間隔
- 6. 長度爲k的可能二進制字符串
- 7. 將Floyd-Warshall限制爲路徑長度k
- 8. 查找數組中長度爲k的所有子集
- 9. 查找長度爲k的所有遞減序列的列表?
- 10. 從長度爲k的數組獲得n上的所有組
- 11. 使用遞歸計算長度爲n的列表中的長度爲k的組合
- 12. 在長度爲N的列表中生成長度爲K的循環移位的所有置換
- 13. 獲取k-1的長度ķ陣列的長度子集陣列
- 14. 將長號縮短爲K/M/B?
- 15. 有K個狀態的NFA接受字符串的長度<= k
- 16. 長度爲
- 17. 長度爲0
- 18. 的JavaScript/JSON。長度爲長度3
- 19. 創建長/爲size_t長度
- 20. 如何將n個排序列表中的平均長度K排序爲O(n * log K)時間?
- 21. 如何製作一個長度爲k比特的二進制字符串
- 22. 未分類長度爲n的數組中k個最大元素的索引
- 23. 切割長度爲L的K個序列以獲得最大數量
- 24. 高效從n個選擇計算長度爲k的下一個排列
- 25. 在長度爲N的路徑上採取k個步驟的方法數量
- 26. 如何在Perl中生成長度爲k的所有有序組合?
- 27. 發現列表的所有K-長度子集在序言
- 28. K&R 2-8 rightrotate(以比特整數的長度)
- 29. 長度增加的字符串的數量k
- 30. 如何找到給定長度的k的置換?
將字符串分成所需長度的樣本;可能通過填充數組,然後'我的$ rnd = $ array [int rand @array]' –
我想我會考慮有'nm * k'字符,不會被使用,'m + 1他們可以去的差距。選擇這些「m + 1」間隙的長度,使它們加起來恰好爲「n-m * k」。 (這樣,你不需要考慮重疊。) – cjm
我假設子串需要是連續的(否則使用迭代器會很容易)? –