Sharp-P(#P)和NP计算复杂度[转]

本文详细解析了Sharp-P(#P)与NP的计算复杂度问题,包括NP问题的验证与Sharp-P问题的计数特性,以及二者在不确定性数据管理中的应用。通过举例说明了如何将NP问题转化为Sharp-P问题,并介绍了#P-complete问题在概率计算中的常见场景。

  今天主要研究 Sharp-P (#P)和 NP 的计算复杂度的问题。 NP 计算复杂度大多数人都听说过, 即非定常多项式(英语:non-deterministic polynomial,缩写NP) 时间复杂性类,或称非确定性多项式时间复杂性类, 包含了可以在多项式时间内验证其解是否正确的那些问题。 注意:NP的定义没有谈到任何 关于求解的问题,只是所说:多项式时间内验证其解是否正确。比如: 我们给一个0-1背包的解,就可以在多项式时间内验证是否满足条件。至于是否能找到 满足条件的解,这在NP复杂度里没有规定。

  Sharp-P (#P)的定义主要指NP问题中对应的满足条件的实例或路径的个数的一类问题。 换言之,拿到一个NP问题后,我们不要问有没有,改问有多少,就会转化成一个Sharp-P (#P)的问题。 比如:0-1背包问有没有这样的方法让一个背包的获益大于某个参数,而负重小于一个参数;这是 NP问题。但是如果我问,有多少种方法让背包中的物品满足这个条件,那就是Sharp-P (#P)问题。 由此可见,Sharp-P (#P)问题比NP更加复杂。

  还有两个密切相关的概念就是NP-complete 和 Sharp-P-complete (#P-complete)。 NP-complete的问题首先是一个NP问题,其次所有的NP问题都能在多项式时间内与它完成归约。 Sharp-P-complete (#P-complete)的问题首先是一个#P问题, 然后所有的#P问题能在多项式时间内采用一个图灵机与它完成归约。

  下面举一个在不确定性数据管理中Sharp-P-complete (#P-complete)的例子。考虑一个布尔表达式 e = (s1交t1)并(s2交t1)。 假设Pr(s1)=0.8, Pr(s2)=0.5, Pr(t1)=0.6. 那么为了计算e的真值的概率,我们需要首先列举出所有e为真值的可能, 即 (1,0,1),(0,1,1) 和 (1,1,1)。那么最后概率是:0.24+0.06+0.24=0.54.

  在上面的问题中,为了计算一个事件e为真的时候,我们不得不列举所有的真值得情况。 这样就产生Sharp-P-complete (#P-complete)的问题。所以,#P-complete 问题在不确定数据管理需要计算概率的时候是非常常见的。

  

  

  

本文可以自由转载,转载时请保留全文并注明出处:
转载自嘉恒说 [ http://www.jiahenglu.net/ ]
原文链接:http://www.jiahenglu.net/blog/5.html

import cv2 import numpy as np # 加载原始图像 image = cv2.imread('C:\\Users\\mio\\Desktop\\毕业设计\\纤维图\\3.png') gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) cv2.imshow('Gray Image', gray_image) cv2.waitKey(0) #### 中值滤波 blurred_image = cv2.medianBlur(gray_image, 5) # 使用核大小为5的中值滤波器 cv2.imshow('Blurred Image', blurred_image) cv2.waitKey(0) #### 图像锐化 kernel_sharpening = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]]) sharpened_image = cv2.filter2D(blurred_image, -1, kernel_sharpening) cv2.imshow('Sharpened Image', sharpened_image) cv2.waitKey(0) #### 图像分割 _, binary_image = cv2.threshold(sharpened_image, 128, 255, cv2.THRESH_BINARY_INV) cv2.imshow('Binary Image', binary_image) cv2.waitKey(0) #### 形态学处理 kernel_morphology = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (1, 3)) opened_image = cv2.morphologyEx(binary_image, cv2.MORPH_OPEN, kernel_morphology) closed_image = cv2.morphologyEx(opened_image, cv2.MORPH_CLOSE, kernel_morphology) cv2.imshow('Opened and Closed Image', closed_image) cv2.waitKey(0) # 找到外部轮廓 contours, hierarchy = cv2.findContours(closed_image, mode=cv2.RETR_EXTERNAL, method=cv2.CHAIN_APPROX_SIMPLE) def detect_endpoints(skeleton): endpoints = [] for y in range(1, skeleton.shape[0]-1): # 遍历每一行 for x in range(1, skeleton.shape[1]-1): # 遍历每一列 if skeleton[y][x] != 0: # 如果当前像素是非零值 neighbors = [ skeleton[y-1][x-1], skeleton[y-1][x], skeleton[y-1][x+1], skeleton[y][x-1], skeleton[y][x+1], skeleton[y+1][x-1], skeleton[y+1][x], skeleton[y+1][x+1]] if sum(neighbors) / 255 == 2: # 判断是否为端点 endpoints.append((y, x)) # 记录端点位置 return endpoints end_points = detect_endpoints(closed_image) # 提取端点[^3] print(f"Detected {len(end_points)} end points.") # 输出端点数量 #### 端点检测与计数 num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(closed_image, connectivity=8) for i in range(1, num_labels): #
03-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值