
알고리즘은 어떻게 설계하나요? 다음 기사에서는 일반적인 알고리즘 패러다임을 분석합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
먼저 세 가지 개념을 명확히 합니다.
알고리즘: 문제를 단계별로 해결하는 과정입니다.
패러다임: 문제에 대한 사고 방식.
알고리즘 패러다임: 문제에 대한 효율적인 솔루션을 구축하기 위한 일반적인 접근 방식입니다.
이 기사에서는
분할 정복은 문제를 원래 문제와 유사한 더 작은 하위 문제로 분해하는 아이디어입니다. 하위 문제는 일반적으로 재귀적으로 해결되며 하위 문제에 대한 솔루션을 결합하여 원래 문제를 해결합니다.
분할정복 방식의 논리는 세 단계로 나눌 수 있습니다.function binarySearchRecursive(array, value, low, high) {
if (low <= high) {
const mid = Math.floor((low + high) / 2);
const element = array[mid];
if (element < value) {
return binarySearchRecursive(array, value, mid + 1, high);
} else if (element > value) {
return binarySearchRecursive(array, value, low, mid - 1);
} else {
return mid;
}
}
return null;
}
export function binarySearch(array, value) {
const sortedArray = quickSort(array);
const low = 0;
const high = sortedArray.length - 1;
return binarySearchRecursive(array, value, low, high);
} 함수는 타인이 호출하는 함수이고, binarySearch 함수는 분할 정복 방식을 구현한 함수임을 참고하시기 바랍니다. binarySearchRecursive
동적 프로그래밍은 복잡한 문제를 더 작은 하위 문제로 나누어 해결하는 데 사용되는 최적화 기술입니다. 분할 정복과 매우 비슷해 보이지만 문제를 독립적인 하위 문제로 분해한 다음 함께 결합하는 대신 동적 프로그래밍은 문제를 독립적인 하위 문제로만 분해합니다.
알고리즘 로직은function minCoinChange(coins, amount) {
const cache = [];
const makeChange = (value) => {
if (!value) {
return [];
}
if (cache[value]) {
return cache[value];
}
let min = [];
let newMin;
let newAmount;
for (let i = 0; i < coins.length; i++) {
const coin = coins[i];
newAmount = value - coin;
if (newAmount >= 0) {
newMin = makeChange(newAmount);
}
if (newAmount >= 0 &&
(newMin.length < min.length - 1 || !min.length) && (newMin.length || !newAmount)) {
min = [coin].concat(newMin);
}
}
return (cache[value] = min);
}
return makeChange(amount);
} 매개변수는 단위([1, 2, 5, 10, 20, 50] RMB)를 나타냅니다. 중복 계산을 방지하기 위해 coins을 사용합니다. cache 함수는 재귀적으로 구현되며 makeChange에 접근할 수 있는 내부 함수입니다. cache
console.log(minCoinChange([1, 2, 5 10, 20], 37)); // => [2, 5, 10, 20] console.log(minCoinChange([1, 3, 4], 6)) // => [3, 3]
그리디 알고리즘은 현재 최적해와 연관되어 전역 최적해를 찾으려고 합니다. 동적 프로그래밍과 달리 전체적인 상황을 고려하지 않습니다. 그리디 알고리즘은 간단하고 직관적인 경향이 있지만 전체적으로 최적의 솔루션은 아닐 수 있습니다.
그리디 알고리즘 사례: 최소 코인 변동 문제위의 동적 프로그래밍으로 해결한 코인 문제는 그리디 알고리즘으로도 해결할 수 있습니다. 이 솔루션이 최적인지 여부는 사용된 명칭에 따라 다릅니다.function minCoinChange(coins, amount) {
const change = [];
let total = 0;
for (let i = coins.length; i>= 0; i--) {
const coin = coins[i];
while (total + coin <= amount) {
change.push(coin);
total += coin;
}
}
return change;
}console.log(minCoinChange([1, 2, 5 10, 20], 37)); // => [2, 5, 10, 20] console.log(minCoinChange([1, 3, 4], 6)) // => [4, 1, 1]
). [3,3]
역추적 알고리즘은 단계별로 솔루션을 찾고 구축하는 데 적합합니다.
관련 무료 학습 권장사항: js 비디오 튜토리얼
위 내용은 알고리즘을 설계하는 방법은 무엇입니까? 일반적인 알고리즘 패러다임 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!