5つの一般的な古典的アルゴリズムのコードテンプレート


アルゴリズムは、プログラマのコードの中で最も強力な試金石を体現することができますが、多くの初心者プログラムである猿の道の障害物です.しかし、プログラムの道が広がっていくためには、アルゴリズムという骨をかじることが、常に精進するための究極の近道です.この文はコードを使って5種類のよく使う経典アルゴリズムの核心の疑似コードのテンプレートを実現して、あなたと共に努力します.この文の5つの古典的アルゴリズムは、再帰的アルゴリズム、深さ優先アルゴリズム(DFS)、広さ優先アルゴリズム(BFS)、二分割ルックアップアルゴリズム、および動的プログラミングアルゴリズムである.
**Talk is cheap, show you the code!**
1、再帰アルゴリズム(Recursion Algorithm)
#         (   )
def recursion(level,param1,param2):
    # level         
    # recursion terminator       
    # MAX_LEVEL         
    if level > MAX_LEVEL:
        print_result
        return
    
    # process in current level   level      
    process(level,data)
    
    # drill down          
    recursion(level+1,p1,p2)
    
    # reverse the current level status if needed       level     
    reverse_state(level)
2、深さ優先アルゴリズム(DFS)
def DFS(node):
    #   visited           
    visited = {}
    visited.add(node)
    
    #   、        
    for next_node in node.children():
        if next_node not in visited:
            visited.add(next_node)
3、広さ優先アルゴリズム(BFS)
def BFS(start,end):
    #   visited           
    visited = {}
    visited.add(start)
    
    #     ,      
    queue = []
    queue.append([start])
    
    #   、         
    while queue:
        node = queue.pop()
        visited.add(node)
        process(node)
        nodes = generate_relate_nodes(node)
        queue.push(node)
4、二分検索アルゴリズム(Binary Search)
def binarySearch(nums, target):
    if not nums:
        return 
    n = len(nums)
    left,right = 0,n-1
    while left <= right:
        mid = left+(right-left)>>1
        if nums[mid] == target:
            return mid 
        elif nums[mid] > target:
            right = mid - 1
        else:
            left = mid + 1
    return
5、ダイナミック企画(Dynamic Prograamming)
def dynamicPro(nums):
    #                       
    if not nums or not nums[0]:
        return 
    m,n = len(nums), len(nums[0])
    dp = [[0 for _ in range(m)] for _ in range(n)]
    #        
    dp[0][0], dp[0][1] = x,y
    
    for i in range(m):
        for j in range(n):
            #      max min   
            dp[i][j] = max/min(
                dp[i-1][j-1],dp[i-1][j],dp[i][j-1])
    return dp[m-1][n-1]
結び目
もちろん、以上の5つのアルゴリズムのコアコードは、コア思想の擬似コードだけです.具体的な問題は具体的に分析して、さらなるコードの最適化と処理をします.参考URL:https://github.com/geektime-geekbang/algorithm-1