Karp的二十一个NP-完全问题

持续学习、持续更新

1.基础概念

  • P问题(polynominal):可以在多项式的时间里找到解决它的算法的问题。
  • NP问题(Nondeterministic polynominal):可以在多项式的时间里验证一个解的问题。
  • NPC问题(Nondeterminism Polynomial complete):是一个NP问题,并且所有的NP问题都可以约化到它。
  • NP-Hard问题(Nondeterminism Polynomial hard):满足NPC问题定义的第二条但不一定要满足第一条。

2.Karp 21 NPC

2.1 布尔可满足性问题(Satisfiability):对于布尔逻辑内合取范式方程式的满足性问题(一般直接叫做SAT)
2.2 0-1整数规划(0-1 integer programming)
2.3 分团问题(Clique,参考独立集)
2.4 Set packing(Set packing)
2.5 最小顶点覆盖问题(Vertex cover)
2.6 集合覆盖问题(Set covering)
2.7 Feedback node set(Feedback node set)
2.8 Feedback arc set
2.9 有向哈密顿循环(卡普命名,现称Directed Hamiltonian cycle)
2.10 无向哈密顿循环(卡普命名,现称Undirected Hamiltonian cycle)
2.11 每句话至多3个变量的布尔可满足性问题(Satisfiability with at most 3 literals per clause, 3-SAT)
2.12 图着色问题(Chromatic number)
2.13 分团覆盖问题(Clique cover)
2.14 精确覆盖问题(Exact cover)
2.15 Hitting set(Hitting set)
2.16 Steiner tree(Steiner tree)
2.17 三维匹配问题(3-dimensional matching)
2.18 背包问题(Knapsack)
2.19 Job sequencing(Job sequencing)
2.20 划分问题(Partition)
2.21 最大割(Max cut)
 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
串匹配是指在一个文本串中查找另一个模式串的过程。常用的串匹配算法有Naïve算法、Rabin-Karp算法和Knuth-Morris-Pratt算法。 1. Naïve算法 Naïve算法是最简单的串匹配算法,也称为暴力匹配算法。它的思路是从文本串的第一个字符开始,依次比较文本串中的每个字符是否与模式串中的字符相等。若不相等,则继续向后比较;若相等,则比较下一个字符,直到找到完全匹配的子串或文本串被匹配完为止。 Naïve算法的时间复杂度是O(mn),其中m和n分别是模式串和文本串的长度。当模式串和文本串长度相等时,最坏情况下时间复杂度达到O(n^2)。 2. Rabin-Karp算法 Rabin-Karp算法是一种基于哈希值的串匹配算法。它的思路是先将模式串和文本串都转换为哈希值,然后比较它们的哈希值是否相等。如果哈希值相等,则再逐个比较模式串和文本串中的字符是否相等。这种方法可以有效地减少比较次数,提高匹配效率。 Rabin-Karp算法的时间复杂度是O(m+n),其中m和n分别是模式串和文本串的长度。但是,由于哈希函数的不完全性和哈希冲突的存在,Rabin-Karp算法在某些情况下可能会出现误判。 3. Knuth-Morris-Pratt算法 Knuth-Morris-Pratt算法是一种基于前缀函数的串匹配算法。它的思路是先计算出模式串的前缀函数,然后利用前缀函数的信息来跳过已经匹配过的部分,减少比较次数。 具体来说,KMP算法在匹配过程中维护一个指针i和一个指针j,其中i指向文本串中当前匹配的位置,j指向模式串中当前匹配的位置。如果当前字符匹配成功,则i和j同时向后移动一位;如果匹配失败,则通过前缀函数计算出j需要跳转到的位置,使得前j-1个字符与文本串中的对应字符已经匹配成功,然后将j指向这个位置,i不变,继续比较下一个字符。 KMP算法的时间复杂度是O(m+n),其中m和n分别是模式串和文本串的长度。由于利用了前缀函数的信息,KMP算法可以在最坏情况下达到O(n)的时间复杂度,比Naïve算法和Rabin-Karp算法更加高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值