アルゴリズムコンピュータ試験の勉強
1. 歯磨き質問サイト
1. Leetcode — https://leetcode-cn.com/problemset/all
2. Niuke オンライン プログラミング アルゴリズム — https://www.nowcoder.com/exam/oj
3. Jianzhi オファー — https://www .nowcoder.com/ta/coding-interviews?page=1
2. 質問の種類
2.1. バックトラッキングアルゴリズム
バックトラッキング アルゴリズムは、問題を解決するための一般的なアルゴリズムです。このアルゴリズムは、問題の検索ツリーの深さ優先検索を実行することによって問題を解決します。バックトラッキング アルゴリズムの考え方は、現在の検索パスで可能なすべてのオプションを試し、質問の意味を満たさない状況に遭遇した場合にバックトラック (つまり、前のステップに戻って別の可能なオプションを選択) することです。バックトラッキング アルゴリズムは、組み合わせ問題を解決したり、考えられるすべての順列や組み合わせを生成したりするためによく使用されます。
バックトラッキング アルゴリズムには通常、次の 3 つのステップが含まれます。
1. 現在の検索パス上で考えられるすべての選択肢を順番に選択します。
2. 選択の各ステップの後、現在の状態を評価して、質問の意味を満たしているかどうかを判断します。
3. 現在の状態が質問の意味を満たしていない場合は、バックトラックします (つまり、前のステップに戻り、別の可能な選択肢を選択します)。そうでない場合、すべての選択肢が評価されている場合、アルゴリズムは終了します。
質問: 8×8マスのチェス上に8つのクイーンを互いに攻撃できないように配置します。つまり、2つのクイーンが同じ行、列、または斜めの線上に配置することはできません。配置する方法は何通りありますか。
#1.回溯算法解决八皇后问题(套娃)
def solution(n):
positions=[-1]*n#8个行分别都是第几列有皇后这个状态
#1.首先在这一行中这一列是否可以放皇后
def could_place_c(row,col):
for i in range(row):
if positions[i]==col or abs(positions[i]-col)==abs(i-row):#不同行的两个皇后不能处于同一列,或者,不能处于一条线上
return False
return True#这一行的这一列可以放皇后
def backtrack(row=0,count=0):#从第0行开始
if row == n:#如果跑完了8行,
count+=1
return count
for col in range(n):
if could_place_c(row,col):#如果这一行的这一列可以放
positions[row]=col
count= backtrack(row+1,count)
return count
return backtrack()
print("8*8的皇后棋盘的解决方案有%d种" %(solution(8)))#92种
2.2. 貪欲なアルゴリズム
W 個の容量を持つナップザックと n 個のアイテムがあり、それぞれに重量と値があるとします。ここでの目標は、アイテムの合計重量がバックパックの容量を超えず、合計値が最大になるように、できるだけ多くのアイテムを選択することです。
貪欲アルゴリズムの方法は、
1. まず各アイテムの単位値 (値を重量で割った値) に従ってアイテムを並べ替える;
2. バックパックの容量が収まらなくなるまで、単位値の大きい順にアイテムを選択する3.
バックパックに収まりきらないアイテムについては、バックパック内の残りのスペースが必要な量に応じて割り当てられます。
このような貪欲なアルゴリズムを通じて、比較的良好な解決策を得ることができますが、必ずしも最適な解決策が得られるとは限りません。
#1.贪心算法解决背包问题
import math
items=[(2,10,60),(3,20,100),(4,30,120)]#物品信息(个数,重量,价值)
max_weight=50#背包可放50重量的物品
def knapsack(items,max_weight):
items=sorted(items,key=lambda x:x[2]/x[1],reverse=True)#价值/重量》单位重量的价值
total_value,total_weight=0,0
for item in items:
if total_weight+item[1]*item[0]<=max_weight and item[0]>0:
total_weight+=item[1]*item[0]
total_value+=item[2]*item[0]
else:
fraction_L=math.modf((max_weight-total_weight)/item[1])[1]#剩余空可以放几个,小数取整数值
print(fraction_L)
total_weight+=item[1]*fraction_L
total_value+=item[2]*fraction_L
break
return total_weight,total_value
tw,tv=knapsack(items,max_weight)
print("total_weight=%d,total_value=%d"%(tw,tv))