基本概念
p問題, np問題, npc問題, np-hard問題的定義和相互關係
npc問題(nondeterministic polynomial complete):
np-hard問題(nondeterministic polynomial - hard):滿足npc問題的第2條但是不一定滿足第1條。即使npc問題獲得了多項式級別的求解演算法,np-hard問題可能仍然找不到多項式級的演算法。
他們之間的關係:
"""用動態規劃方法求解揹包問題
輸入:w: 物品的重量 dtype int
v: 物品的價值 dtype int
b: 揹包的重量
輸出:x:最優解,各個物品是否裝入揹包
max_value:裝入揹包的物品的重量
"""# 判斷異常
if len(w)!=len(v):
print('請檢查輸入')
return -1,0
# 邊界條件
n = len(w)
# f[i,j] 當揹包重量為j,可取前i個物品時,可裝入物品的最大重量
f = np.zeros((n+1, b+1), dtype=int)
# info[i,j],當揹包重量為j,可取前i個物品時, 裝入的物品的最大標號
info = np.zeros((n+1, b+1), dtype=int)
f[:,0] = 0
f[0,:] = 0
# 遞推 轉移方程:f_k(y) = f_k(y-x) + v_k
for y in range(1,b+1):
for k in range(1,n+1):
f[k, y] = f[k-1, y]
info[k, y] = info[k-1, y]
if (y-w[k-1] >= 0) & ( f[k-1, y-w[k-1]]+v[k-1] > f[k, y]):
f[k, y] = f[k-1,y-w[k-1]] + v[k-1]
info[k, y] = k
# 追蹤結果
x = np.zeros(n, dtype=int)
max_value = f[-1,-1]
k = info[-1,-1]
leftb = b
while k > 0:
x[k-1] = 1
leftb = leftb - w[k-1]
k = info[k-1, leftb]
# 輸出
return x, max_value
v = np.random.randint(1,100,1000,dtype=int)
w = np.random.randint(1,100,1000,dtype=int)
b = int(w.sum()*0.4)
x, max_value = dynamicalgorithm_knapscak(w, v, b)
print(x.sum(), max_value)
def dynamicalgorithm_knapscak(w, v, b):
"""w: 物品的重量和體積 多維陣列,dtype int
v: 物品的價值 dtype int
b: 最大體積和最大重量
f_k(y) = f_k(y-x) + v_k
"""if len(w[0])!=len(v):
print('請檢查輸入')
return -1,0
# 邊界條件
n = len(v)
f = np.zeros((n+1, b[0]+1, b[1]+1), dtype=int)
info = np.zeros((n+1, b[0]+1, b[1]+1), dtype=int) # 裝入的物品的最大標號
# 遞推
for k in range(1,n+1):
for y1 in range(1,b[0]+1):
if (y1-w[0,k-1] >= 0):
for y2 in range(1,b[1]+1):
f[k, y1, y2] = f[k-1, y1, y2]
info[k, y1, y2] = info[k-1, y1, y2]
if (y2-w[1,k-1] >= 0):
if f[k-1, y1-w[0,k-1], y2-w[1,k-1]] + v[k-1] > f[k, y1, y2]:
f[k, y1, y2] = f[k-1, y1-w[0,k-1], y2-w[1,k-1]]+v[k-1]
info[k, y1, y2] = k
else:
f[k, y1, :] = f[k-1, y1, :]
info[k, y1, :] = info[k-1, y1, :]
# 追蹤結果
x = np.zeros(n, dtype=int)
max_value = f[-1, -1, -1]
k = info[-1, -1, -1]
leftw = b[0]
leftc = b[1]
while k > 0:
x[k-1] = 1
leftw = leftw - w[0, k-1]
leftc = leftc - w[1, k-1]
k = info[k-1, leftw, leftc]
# 輸出
return x, max_value
w = np.random.randint(1,60,(2,1000),dtype=int)
b = [120,120]
v = np.random.randint(2,5000,1000,dtype=int)
x, max_value = dynamicalgorithm_knapscak(w, v, b)
print('x = :',x, '\n max_value=', max_value)
def partition(nums,l,r):
k = random.randint(l+1,r)
nums[l], nums[k] = nums[k], nums[l]
i = l+1 # [l+1, i) <= nums[l]
j = r # (j, r] > nums[l]
while true:
while (i <= r) and (nums[i] < nums[l]):
i +=1
while (j >= l+1) and nums[j] > nums[l]:
j -=1
if i > j:
break
nums[i], nums[j] = nums[j], nums[i]
i +=1
j -=1
nums[l],nums[j] = nums[j], nums[l]
return j
def findkthminest(nums, kth):
l = 0; r = len(nums)-1
while true:
mid = partition(nums, l, r)
if mid+1 == kth:
return nums[mid]
elif mid+1 < kth:
l = mid+1
kth = kth-(mid+1)
else:
r = mid
第一次面試經歷 某公司後端研發
筆試部分是做了10道題目,主要是類似於leetcode上的題.也包含了一些設計題目,比如說怎麼設計乙個爬蟲系統的去重.在面試的時候答題紙也被送過來,面試官會選擇裡面乙個問題 主要是沒做出來的 來問你.題目我會記錄下來放到github上.一面聊的時間很長,總共70分鐘左右.總共問了三個大題吧.發現在面...
第一次面試
話說3月4號學院召開實習動員大會並有三家公司過來進行宣講會,分別是國家體育總局亞運專案組,金蝶和華際友天,由此開始了實習生涯。周五的傍晚,正吃著飯的時候突然收到簡訊通知,金蝶週六上午10點有個面試。當晚就瀏覽著些簡歷製作相關的網頁,為第二天做準備,總以為,簡歷弄得可以了,然後每太留意去完善 後來才知...
第一次面試
今天參加了一場面試,跟面試官一共說了不到3句話,就被婉拒。我都不知道該說什麼了,也許我的語言太蒼白無力,也許因為的的渣簡歷 渣實力。現在回憶,當時失力的原因主要有以下幾點 1.沒做準備,開始讓我自我接受時,我不知該說些什麼,就草草結束,說完之後,還嫌死得不夠直接,補了一刀。說,請問如何稱呼你?教訓 ...