ブルートフォース
16944 ワード
📌 アルゴリズムパターン
一般的なアルゴリズムアクセス方法を組み合わせて
알고리즘 패러다임
と呼ぶ.📌 ブルートフォースの概要
Brute-Force Attack
無差別対入攻撃だそうです.例えば、パスワードが0000から9999までのロックがあると仮定します.
0000, 0001, 0002, ..., 9999まで可能なすべての数字を試してみることでパスワードを見つけることができます.
브루트 포스
は,ある問題に対して可能な限り多くの試行回数を行う最も純粋なアルゴリズム近接法である.カードの団子が2つあります.左からカードを1枚、右からカードを1枚引いて、2つの数の積を最大にしたいです.近づく方法
브루트 포스
でアプローチしてみます.ブルートフォスは可能な限りの数を確認した.
すべての可能な組み合わせにおいて、6 x 4=24を乗じると最大となる.
デッキ最大コンビネーション
문제
カードが2束ある.左の束からカードを1枚、右の束からカードを1枚引きたいのですが、2つの数の積が一番大きいです.どのようにして最大の積を求めることができますか?
関数
max_product
は、リストleft_cards
およびリストright_cards
をパラメータとする.left_cards
は左の札団の数字を含み、right_cards
は右の札団の数字を含み、max_product
はleft_cards
の中から1枚の札を抽出し、right_cards
の中から1枚の札を抽出したときの値が最大の値を返します.💻
풀이
def max_product(left_cards, right_cards):
result = []
for i in left_cards:
for j in right_cards:
result.append(i * j)
return(max(result))
print(max_product([1, 6, 5], [4, 2, 3]))
print(max_product([1, -9, 3, 4], [2, 8, 3, 1]))
print(max_product([-1, -7, 3], [-4, 3, 6]))
👉 출력
24
32
28
🧭 時間の複雑さlen(left cards)は
m
,len(right cards)はn
であった.関数max productは左cardsサイクルの繰返し文に右cardsサイクルの繰返し文を重畳するため,max productの時間複雑度はO(mn)である.
📌 Brute Force評価
ブルートフォードアルゴリズムの入力が大きいほど効率が低下する.
📝 フルート砲の長所
一番近い売り場を探しています
売り上げが减ったので、支店を闭める危机に直面している.どのような支店を閉鎖すれば会社への打撃は小さくなりますか?お互いに近い売り場があれば、そのうちの1つが消えても大丈夫です.
社長が秘書に与えた任務は、直線距離が一番近い売り場を2つ探して報告することだ.
営業チームは各売り場の座標位置をスケジューラとして持ってきます.
tupleはx,y座標で各売り場の位置を表す.
0番売り場は(2,3)にあり、1番売り場は(12,30)にあります.
関数
closetst_pair
は、座標リストをパラメータとして受け入れ、リスト内の最も近い2つの売り場に[(x1, y1), (x2, y2)]
形式で戻る.2つの座標間距離を計算する関数
distance
は、入力によって2つの図面を得、その間の直線距離を返す.💻
풀이
from math import sqrt
def distance(store1, store2):
return sqrt((store1[0] - store2[0]) ** 2 + (store1[1] - store2[1]) ** 2)
def closest_pair(coordinates):
pair = [coordinates[0], coordinates[1]]
for i in range(len(coordinates)):
for j in range(i + 1, len(coordinates)):
if distance(pair[0], pair[1]) > distance(coordinates[i], coordinates[j]):
pair = [coordinates[i], coordinates[j]]
return pair
test_coordinates = [(2, 3), (12, 30), (40, 50), (5, 1), (12, 10), (3, 4)]
print(closest_pair(test_coordinates))
🧭 時間の複雑さ入力リスト座標の長さは
n
です.関数closest pairには2つの重複文が重なり,2つの重複回数はいずれもnに比例する.したがって,関数の時間的複雑さはO(n^2)である.
江南駅豪雨
江南駅に大雨が降ったと仮定します.本当に災害映画の雨量で、高層ビルは雨で水没した.
そうなったとき、建物と建物の間にどれだけの雨が入るか知りたいです.それを計算する関数
trapping_rain
を書いてみました.関数track rainは、建築高さ情報を格納するリスト
buildings
をパラメータとして受信し、含まれる雨水の総量を返す.たとえばパラメトリック建築[3,0,0,2,0,4]が入ってきました.では、0番索引には高さ33の建物、3番索引には高さ22の建物、5番索引には高さ44の建物があります.1番、2番、4番インデックスには建物がありません.
では、下の写真によると、全部で1010余りの雨を入れることができます.したがって、track rain関数は10を返します.
💻
풀이
def trapping_rain(buildings):
rain = 0
for i in range(1, len(buildings)-1):
left = max(buildings[:i])
right = max(buildings[i + 1:])
min_floor = min(left, right)
if min_floor - buildings[i] < 0:
rain += 0
else:
rain += min_floor - buildings[i]
return rain
print(trapping_rain([3, 0, 0, 2, 0, 4]))
print(trapping_rain([0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]))
🧭 時間の複雑さ室内建築の長さはnと言います.
まずfor文の繰返し回数はnに比例する.また、繰り返し文で最も時間がかかる部分は
max(buildings[:i])
またはmax(buildings[i:])
である.二つの中から一つ選びましょうまず,
buildings[:i]
は最悪の場合O(n)である.そしてmax関数を用いて最値を探し,これもO(n)である.O(2 n)であるため、最終的にはO(n)となる.for文の繰返し回数はnに比例し,for文の中で最も長い時間の部分はO(n)であるため,
trapping_rain
関数の時間複雑度はO(n^2)である.Reference
この問題について(ブルートフォース), 我々は、より多くの情報をここで見つけました https://velog.io/@revudn46/Brute-Forceテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol