一道算法题求解答

jrjdr19830726 2009-08-11 05:09:36
一个字符串,长度为5,字符串的每个位置上只能出现A T G C四个字符中的一个,每个位置上的四种字符出现的概率不同,要求计算出生成概率最大的前50个字符串,不使用穷举,

例如
位置 1 2 3 4 5

A 0.2 0.3 0.1 0.55 0.25

T 0.3 0.5 0.6 0.25 0.25

G 0.1 0.05 0.2 0.2 0.25

C 0.4 0.15 0.1 0 0.25

则出现概率最大的前4个字符分别是:
CTTAA CTTAT CTTAG CTTAC
它们的概率皆为:P(x)=0.4 * 0.5 * 0.6 * 0.55 * 0.25
...全文
375 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zsxcn 2009-08-24
  • 打赏
  • 举报
回复
mark
青蛙果果 2009-08-23
  • 打赏
  • 举报
回复
等待高人
arczee 2009-08-23
  • 打赏
  • 举报
回复
有一种方法,其时间复杂度为O(n*X), 先给出根据概率选取的从大到小排列的概率组合序列如下,要注意的是,P(1)表示某列中的最大概率,而从左到右的顺序是所有P(1)从大到小排列的。即先选所有组的最大概率中的最大的,标记此列,再选剩下列中最大概率的最大值,以此类推。
P(1)*P(1)*P(1)*P(1)*P(1) //都能看出来的最大概率组合

P(1)-P(1)-P(1)-P(1)-P(2) //***第一轮: P(2)是某列中的第二大概率字母的概率
P(1)-P(1)-P(1)-P(2)-P(1)
P(1)-P(1)-P(2)-P(1)-P(1) //P(2)从右到左的顺序保证了其下面的所有概率组合的
P(1)-P(2)-P(1)-P(1)-P(1) //概率和都比它小。
P(2)-P(1)-P(1)-P(1)-P(1)


P(1)-P(1)-P(1)-P(2)--P(2) //***第二轮 固定最后一个为P(2),再将前面选择的四列
P(1)-P(1)-P(2)-P(1)--P(2) //重复第一轮类似的过程
P(1)-P(2)-P(1)-P(1)--P(2)
P(2)-P(1)-P(1)-P(1)--P(2)

P(1)-P(1)-P(2)--P(2)-P(2) //***第三轮 固定最后两个选择列为P(2),再重复
P(1)-P(2)-P(1)--P(2)-P(2)
P(2)-P(1)-P(1)--P(2)-P(2)

P(1)-P(2)--P(2)-P(2)-P(2)
P(2)-P(1)--P(2)-P(2)-P(2)

P(2)-P(2)-P(2)-P(2)-P(2) //到此,含P(1)的组合都抽出来了,并排了序。

P(2)-P(2)-P(2)-P(2)-P(3)
P(2)-P(2)-P(2)-P(3)-P(2)
P(2)-P(2)-P(3)-P(2)-P(2)
P(2)-P(3)-P(2)-P(2)-P(2)
P(3)-P(2)-P(2)-P(2)-P(2)
。。。

这只是一个思想,但是容易转化为程序,因为有规律可循, 对于长度N很大时很有效率,每次的代码花费在从所有列中取出P(i),并进行排序。记代价为O(X),根据方法不同而不同。
arczee 2009-08-23
  • 打赏
  • 举报
回复
直接用贪心法肯定不行的,贪心法只能得出最优的,而无法得出次优的,另想吧
whg01 2009-08-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qq675927952 的回复:]
贪心吧,每一个位置都取这个位置上概率最大的字符
[/Quote]

正解。
showjim 2009-08-12
  • 打赏
  • 举报
回复
应该是很多个"最大50"两两归并
showjim 2009-08-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sbwwkmyd 的回复:]
引用 8 楼 fire_woods 的回复:
楼上的方法不错.支持.

对的,把数据分成两部分64*n;n那边取最大值,64这边取前50,这样不可能有其它给合比这50大了.
[/Quote]
错了,不对,n这边第二大数乘以64那边最大数 是可能大于 n这边最大数乘以64那边最小数的;
明天再想想.
showjim 2009-08-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fire_woods 的回复:]
楼上的方法不错.支持.
[/Quote]
对的,把数据分成两部分64*n;n那边取最大值,64这边取前50,这样不可能有其它给合比这50大了.
mathwj 2009-08-12
  • 打赏
  • 举报
回复
我觉得可能是这样的:
(1)对五个位置,各自建立一个队列并进行从大到小的排序
(2)第一个字符串肯定五个位置中各自的队头字符,这五个元素出队列组成该字符串。
(3)在五个队列的队头中找出最大值,并代替字符串中最小值。
(4)循环(3),就此输出三十个字符串。
jrjdr19830726 2009-08-12
  • 打赏
  • 举报
回复

7楼是不是这个意思?

类动态规划

维护一个包含有50个字符串的最高概率的list。 list <string>的容量为50
比如
计算含有第一个字符并概率最高的前50个子串
有 4 个 string 分别为 A T C G
计算含有第一,第二个字符并概率最高的前50个子串
有 16 个 string
计算含有第一,第二,第三个字符并概率最高的前50个子串
有 64 个 string (只取 有最高概率的前50)加入list

计算含有第一,第二,第三,第四个字符并概率最高的前50个子串

将原list中50个长度为三的string(x1,x2,x3)每一个都使用穷举扩展成长度
为四的string :
(x1,x2,x3,A),(x1,x2,x3,T),(x1,x2,x3,G),(x1,x2,x3,C)

则原50个string可形成50*4=200个四字符的字符串string,对这200个string进行排序
将五十个概率最高的字符串加入list

计算含有第一,第二,第三,第四,第五个字符并概率最高的50个字符串
。。。。。。。。
由于最大概率字符串必然包含最大概率子串,则都只取有最高概率的前50个string
最后留下来的自然是概率最大的50个string;
fire_woods 2009-08-12
  • 打赏
  • 举报
回复
楼上的方法不错.支持.
  • 打赏
  • 举报
回复
类动态规划

维护一个包含有50个字符串的最高概率的list。 list<string>string的容量为50
比如
对于进入第一个字符
有 4 个 string 分别为 A T C G
对于进入第二个字符
有 16 个 string
对于进入第三个字符
有 64 个 string (只取 有最高概率的前50)

对于以后的……
都只取有最高概率的前50最后留下来的自然是前50;


[Quote=引用楼主 jrjdr19830726 的回复:]
一个字符串,长度为5,字符串的每个位置上只能出现A T G C四个字符中的一个,每个位置上的四种字符出现的概率不同,要求计算出生成概率最大的前50个字符串,不使用穷举,

例如
位置    1    2    3    4    5

A      0.2  0.3  0.1  0.55 0.25

T      0.3  0.5  0.6  0.25 0.25

G      0.1  0.05 0.2  0.2  0.25

C      0.4  0.15 0.1  0    0.25

则出现概率最大的前4个字符分别是:
CTTAA CTTAT CTTAG CTTAC
它们的概率皆为:P(x)=0.4 * 0.5 * 0.6 * 0.55 * 0.25
[/Quote]
linren 2009-08-11
  • 打赏
  • 举报
回复
例如
位置 1 2 3 4 5

A 0.2 0.3 0.1 0.55 0.25

T 0.3 0.5 0.6 0.25 0.25

G 0.1 0.05 0.2 0.2 0.25

C 0.4 0.15 0.1 0 0.25

因为可以重复选择
所以直接选取每个位置上概率最大的字母就可以了……

如果有一个50位的表
第1个数选择第1位上概率最大的字母
第2个数选择第2位上概率最大的字母
……
第50个数选择第50位上概率最大的字母……
jrjdr19830726 2009-08-11
  • 打赏
  • 举报
回复
实际运用中基因碱基序列的字符串长度通常是20到100,如果使用穷举,太耗时(最少是4的20次方)
qq675927952 2009-08-11
  • 打赏
  • 举报
回复
贪心吧,每一个位置都取这个位置上概率最大的字符
CCC_YQ 2009-08-11
  • 打赏
  • 举报
回复
帮你顶!
fire_woods 2009-08-11
  • 打赏
  • 举报
回复
吐血推荐穷举.
tinghaiou 2009-08-11
  • 打赏
  • 举报
回复
什么算法,看都能看的出来
微软等数据结构+算法面试100最后20第81-100新鲜出炉 ---100系列V0.1版完整公布 作者:July 时间:2010年12月5日 ============= 首先,非常感谢各位,对本微软面试100系列前期工作的大力支持。 很多很多热心的网友,积极参与进来,或在我的帖子上一起做, 或对已经上传的案,对每一算法提出质疑, [我将继续不断优化、改进每一算法,直到极限。] 或在我的博客里留言,大力支持的, 在此,向各位一致表示最衷心的感谢。 ...... //...... 好了,说了这么多,接下来,请继续尽情的享用: 本微软等100 系列V0.1 版前80 : http://blog.csdn.net/v_JULY_v/archive/2010/11/27/6039896.aspx 先来,来几组百度的面试: ====================== ...... ======================== 关于本微软等公司数据结构+算法面试100V0.1版 1.一切的详情,请参见My Blog: http://blog.csdn.net/v_JULY_v 2.关于本微软等公司数据结构+算法面试100系列V0.1版的郑重声明 http://blog.csdn.net/v_JULY_v/archive/2010/12/02/6050133.aspx 3.所有的资源下载地址: http://v_july_v.download.csdn.net/ 4.本微软等100系列V0.1版,永久维护地址: http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html 5.一切的详情,还是在本博客里。 本博客致力于数据结构之法、算法优化之道 不断更新、优选、搜集、整理微软等各大公司的精彩面试。 欢迎,持久、继续关注本博客。 相信,另外不同、更具精彩的100V0.2版,很快就能与大家见面。:D。 谢谢,大家。 谢谢,各位。 谢谢。 欢迎,任何人,就以上任何内容,目与案思路,与我联系: 作者邮箱: zhoulei0907@yahoo.cn ================== 作者声明: 本人July对以上所有任何内容和资料享有版权,转载请注明作者本人July及出处。 向你的厚道致敬。谢谢。2010年12月05日。

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧