1. 程式人生 > >演算法分析與設計第十七週

演算法分析與設計第十七週

習題8.3——證明吝嗇SAT問題是NP完全問題
問題描述:給定一組子句(每個子句都是其中文字的析取)和整數k,求一個最多有k個變數為true的滿足賦值——如果該賦值存在。證明吝嗇SAT問題為NP完全問題。

顯然吝嗇SAT問題是NP問題,因為可以代入可能的解即可判斷是否滿足,時間是多項式的。已知SAT是NP完全問題,所以證明的關鍵是可以在多項式時間內將SAT規約到吝嗇SAT。
證明如下:
對於任何SAT中的例項I(文字個數為n),定義f(I)為這樣的對映:f(I)為具有SAT問題的形式,且文字數為k,且k≥n
此時f(I)即為吝嗇SAT的例項。對於f(I),若有解s,令h(s)為這樣的對映:h(s)為s中n個變數取true,n≤k。
顯然,s存在,則h(s)存在,即吝嗇SAT問題有解,則SAT問題有解。若s不存在,則SAT問題也不存在解。
可以看到,對映f和h都是多項式複雜度的,所以SAT可以規約到吝嗇SAT.由於SAT問題是NP完全的,所以吝嗇SAT也是NP完全問題。

相關推薦

演算法分析設計

習題8.3——證明吝嗇SAT問題是NP完全問題 問題描述:給定一組子句(每個子句都是其中文字的析取)和整數k,求一個最多有k個變數為true的滿足賦值——如果該賦值存在。證明吝嗇SAT問題為NP完全問

演算法分析設計

分析:每次移除一個數,要儘可能使前面的數最小,因為前面的數的權值最大。而刪除一個數,會導致後面緊接著的一個數代替刪除的數的位置。所以在一次移除操作中,從前往後檢查,一旦發現某個數後繼的數更小,則刪除此數。複雜度為o(k*n),可以採用遞迴的方法實現。(然而遞

演算法分析設計

這裡直接採用手工乘法演算法,兩個迴圈即可解決,複雜度為o(n*m),n,m分別為兩個字串的長度 程式碼: string multiply(string num1, string num2)

演算法分析設計四次作業(leetcode中Cherry Pickup題解)

題解正文 題目描述 問題分析 此題給出一個n乘n矩陣,矩陣中值可以是0/1/-1。 要求我們找出從(0,0)出發,到(n-1,n-1),然後回到(0,0)的路徑,要求往程只能向右向下,而返程只能向左向上走,並且路徑沒有經過值為-1的位置。 然後求出符合上述要求的路徑中,所經

演算法分析設計次作業之Remove Duplicate Letters題解

題解正文 題目描述 問題分析 題目意思是,給定一個只包含小寫字母的字串,我們要刪除其中所有的重複字元,然後從這些刪除方法所得結果中選擇字典序最小的字串作為本題的答案 解題思路 下面的解題過程中我們都是從左往右選擇字元新增到答案字串中 所謂去重,那麼要保證每

演算法分析設計四周

思路:用兩個“指標”,後面的指標找合法的視窗,前面的指標來縮小視窗到最小,找出最小的那個即為答案。 程式碼: class Solution { public: string minWind

演算法分析設計:134. Gas Station

題目簡介: There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You have a car with an unl

演算法分析設計

題目描述: 方法一:這是我最開始想到的方法,簡答直接。先找到連結串列的長度count,然後刪除第count-n+1個節點。需要兩遍遍歷。複雜度為o(n),n為連結串列的長度。 程式碼: class Solution { public: List

演算法分析設計五次作業(leetcode 中 Majority Element 題解)

心得體會 這個題目有兩個版本Majority Element,和Majority Element II,解題的方法比較巧妙,有點想不到的感覺,並且證明過程也很有趣,所以就記錄下來(具體詳情見正文題解)。 題解正文 題目描述 問題分析 題目要求majority

演算法分析設計八次作業(leetcode中Sum of Distances in Tree題解)

Sum of Distances in Tree 題解 題目描述 題目分析 題目意思很清楚:題目給出一個擁有最小邊數的連通圖,也就是一共n個頂點,n-1個邊的連通圖,這種圖的性質是從任意頂點出發進行遍歷都能夠得到一棵樹。要求我們求出每個點到其他點的距離之和,即

演算法分析設計九周

分析:暴力法,列舉所有的排列,複雜度為o(n!),顯然不可取。如果原來的排列是降序的,則無法找到更大的排列,返回上升序的排列。如果不是降序的,則從尾部開始找,直到發現第一對nums[i] < nums[i+1],i記為flag1,可知從i以後,是降序的

演算法設計分析作業題】:20. Valid Parentheses

題目 C++ solution class Solution { public: bool isValid(string s) { stack<char> cstack; for (int i = 0; i < s.si

演算法分析設計:Generate Parentheses

問題描述: Given n pairs of parentheses, write a function to generate all combinations of well-formed

演算法分析設計: Find Bottom Left Tree Value

問題描述: Given a binary tree, find the leftmost value in the last row of the tree. Example 1:

演算法分析設計】【】139. Word Break

Word Break 題目大意 思路 解題程式碼 時間複雜度 動態規劃基礎訓練。 139. Word Break 題目大意 給定一個字串和一個合法詞的集和(詞典),判斷該字串能否由詞典中的片語成。 例 s= “l

演算法分析設計丨LeetCode(21)——Binary Tree Maximum Path Sum(Hard)

題目描述: Given a binary tree, find the maximum path sum. For this problem, a path is defined as any sequence of nodes from some starting node to any node in

演算法分析設計Ⅱ:Merge Two Sorted Lists

問題描述: Merge two sorted linked lists and return it as a new list. The new list should be made by s

演算法分析設計:Minimum Size Subarray Sum

演算法描述: Given an array of n positive integers and a positive integer s, find the minimal length of

演算法分析設計】【】169. Majority Element

方法概覽 這題和《演算法概論習題》2.23是一樣的。老師剛講過,複習一下。 題目大意:找到出現次數超過一半的元素。 看到題目,應該想到,給定一個整數陣列,找出出現次數大於N/2 的那個數,且這樣的數若存在,就僅僅存在一個。 方法很多,這裡總結四

輸出拓撲排序的所有可能結果(題目來源:演算法分析設計及其案例教程五章課後習題五題)

這是我在csdn 的第②篇部落格 該篇為C++程式碼 原題問的是實現拓撲排序的方法,但答案給除了所有的拓撲排序的可能。 看到答案這麼寫我就在想如何才能輸出所有拓撲排序的結果?,但我一開始只能寫出輸出一種可能的拓撲排序結果的程式碼,經過一天的查詢資料後在CSDN