1. 程式人生 > >算法分析(課程筆記)

算法分析(課程筆記)

小問題 技術 其他 問題 swa pri urn 通過 目錄

目錄

  • 遞歸與分治
    • 全排列

希望通過寫博客 促進自己學習,都是課本上算法的實現,隨課程更新

遞歸與分治

全排列

基本思路就是分治,大問題化小問題。

假設 R={A B C D},對R進行全排列,會有24種結果。把R劃分為{A | B C D},假定A已經排列好了,只需要再排列{B C D}既可。這就可以通過遞歸來實現了。(第一個排列好的其他劃分:{B | A C D} {C | A B D} {D | A B C})

#include <iostream>
#include <cstdio>
#include <cstdlib>

template <class T>
void swap(T &a, T &b)   //交換函數
{
    T temp;
    temp = a;
    a = b;
    b = temp;
}

void print(char e)  //輸出函數
{
    printf("%c ", e);
}

//perm函數,k為開始位置,m為序列元素個數,void (*print)(T e)為輸出函數指針。
//perm函數會從k開始對m個元素進行全排列
template <class T>
void perm(T list[], int k, int m, void (*print)(T e))
{
    if(k==m)
    {
        for(int i = 0; i < m; i++)
            print(list[i]);
        printf("\n");
    }
    else
    {
        for(int i = k; i < m; i++)
        {
            swap(list[k], list[i]);    //兩個swap在下面解釋
            perm(list, k+1, m, print);
            swap(list[k], list[i]); 
            
        }
    }
}

int main()
{
    char list[]={‘A‘, ‘B‘, ‘C‘, ‘D‘};
    perm(list, 0, 4, print);
    return 0;
}

技術分享圖片

解釋一下兩個swap,比如上圖,第三行第一個是由ABCD的BC交換得來的,排列完成後,ACBD通過交換變回ABCD,再進行ADBC的排列

算法分析(課程筆記)