序列与子序列问题解析
在计算领域,涉及序列和子序列的问题十分常见,比如在基因组学、文本处理、数据挖掘和数据压缩等方面。下面我们将深入探讨三个相关问题,包括最长上升子序列、最长公共子序列以及最大和短片段问题。
1. 最长上升子序列问题
最长上升子序列问题是指,给定一个有序类型的元素序列,找出其中元素严格递增的最长子序列。我们使用函数 lus 来计算这个最长上升子序列:
lus::Ord a ⇒[a] →[a]
lus ←MaxWith length·filter up·subseqs
其中, up 函数用于判断一个序列是否为上升序列:
up::Ord a ⇒[a] →Bool
up xs = and (zipWith (<) xs (tail xs))
subseqs 函数用于生成序列的所有子序列,有两种基于 foldr 的定义方式:
-- 第一种方式
subseqs::[a] →[[a]]
subseqs = foldr step [[ ]]
where step x xss = xss++map (x:) xss
-- 第二种方式
subseqs::[a] →[[a]]
subseqs = foldr (concatMap·extend) [[ ]]
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



