写点什么

Week8 作业

用户头像
lggl
关注
发布于: 2020 年 12 月 13 日

1.有两个单向链表(链表长度分别为 m,n),这两个单向链表有可能在某个元素合并,也可能不合并,如下图所示的这样。现在给定两个链表的头指针,在不修改链表的情况下,如何快速地判断这两个链表是否合并?如果合并,找到合并的元素,也就是图中的 x 元素。

请用代码(或伪代码)描述算法,并给出时间复杂度。


这是经典的 LCS 问题,如果用常规遍历解法,时间复杂度是 O(m*n),如果采用动态规划策略,时间复杂度是 O(mlogn)。

设 C[i,j]C[i,j]表示 XiXi 和 YjYj 的最长公共子序列 LCS 的长度。如果 i=0i=0 或 j=0j=0,即一个序列长度为 00 时,那么 LCS 的长度为 0。根据 LCS 问题的最优子结构性质,动态规划状态转移方程式为:

代码实现为:

def lcs(X, Y):    # find the length of the strings    m = len(X)    n = len(Y)
# declaring the array for storing the dp values L = [[None] * (n + 1) for i in range(m + 1)]
"""Following steps build L[m + 1][n + 1] in bottom up fashion Note: L[i][j] contains length of LCS of X[0..i-1] and Y[0..j-1]""" for i in range(m + 1): for j in range(n + 1): if i == 0 or j == 0: L[i][j] = 0 elif X[i - 1] == Y[j - 1]: L[i][j] = L[i - 1][j - 1] + 1 else: L[i][j] = max(L[i - 1][j], L[i][j - 1])
# L[m][n] contains the length of LCS of X[0..n-1] & Y[0..m-1] return L[m][n]
if __name__ == '__main__': print(lcs('abxyz','defxyz'))
复制代码

结果为 3,如果结果大于 0,说存在公共子串,也就是合并。


2.请画出 DataNode 服务器节点宕机的时候,HDFS 的处理过程时序图。


用户头像

lggl

关注

还未添加个人签名 2018.08.28 加入

还未添加个人简介

评论

发布
暂无评论
Week8作业