알고리즘은 어떻게 설계하나요? 다음 기사에서는 일반적인 알고리즘 패러다임을 분석합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
먼저 세 가지 개념을 명확히 합니다.
알고리즘: 문제를 단계별로 해결하는 과정입니다.
패러다임: 문제에 대한 사고 방식.
알고리즘 패러다임: 문제에 대한 효율적인 솔루션을 구축하기 위한 일반적인 접근 방식입니다.
이 기사에서는
분할 정복은 문제를 원래 문제와 유사한 더 작은 하위 문제로 분해하는 아이디어입니다. 하위 문제는 일반적으로 재귀적으로 해결되며 하위 문제에 대한 솔루션을 결합하여 원래 문제를 해결합니다.
분할정복 방식의 논리는 세 단계로 나눌 수 있습니다.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 중국어 웹사이트의 기타 관련 기사를 참조하세요!