原创 劍指Offer[38]:字符串的排列

題目 輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的所有字符串abc, acb, bac, bca, cab和cba。 題目來源於牛客網,對劍指Offer書

原创 [機器學習] EM算法

  在前面的樸素貝葉斯分類器推導中,我們是基於訓練樣本所有屬性值都是已知的這個假設,但是實際應用中往往存在訓練樣本的某些屬性值未知,此時就需要用到EM算法來進行參數估計。EM算法的全稱爲最大期望算法(Expectation-Max

原创 [機器學習] 樸素貝葉斯分類器

基礎知識   樸素貝葉斯分類器是基於貝葉斯決策理論的分類模型,首先來了解一下貝葉斯決策理論和概率論的相關知識。 貝葉斯決策理論   概率決策是貝葉斯決策理論的核心思想。在執行分類任務的時候我們無法保證分類的結果總是正確的,貝葉斯決

原创 二叉查找樹的基本實現

定義 數組和鏈表 數組和鏈表是兩種使用頻率非常高的數據結構,但兩者的結構也決定了他們的應用場景。數組的元素在內存中的地址是連續的,而構成鏈表的結點在內存中的地址不連續,數組的元素可以通過索引進行隨機訪問,鏈表則需要遍歷訪問,因

原创 二分查找的遞歸和迭代實現

基本思想   在一個數組中查找某個特定元素的時候,直觀的方法就是從頭開始向後進行遍歷。但是,如果數組一開始就是有序的,那麼我們就可以有更快的查找方式——二分查找。二分查找是二分法思想的一個典型應用,具體來說,對於一個有序數組,我們

原创 劍指Offer[24]:反轉鏈表

題目   定義一個函數,輸入一個鏈表的頭節點,反轉該鏈表並輸出反轉後鏈表的頭節點。我們將鏈表的節點定義如下: class ListNode{ private int val; // 節點值 private List

原创 劍指Offer[16]:數值的整數次方

題目    實現函數 double Power(double base, int exponent), 求base的exponent次方,不使用庫函數,同時不需要考慮大數問題。 分析   書中作者已經分析的很清楚了,主要有兩個方面

原创 模糊c均值聚類及python實現

原理簡介   模糊c均值聚類(Fuzzy C-Means)是引入了模糊理論的一種聚類算法,通過隸屬度來表示樣本屬於某一類的概率,原因在於在很多情況下多個類別之間的界限並不是絕對的明確。顯然,相比於k-means的硬聚類,模糊c均值

原创 十大排序算法總結(附java實現)

定義   排序 是計算機內部經常進行的一項操作,目的是將一組無序的序列調整爲一組有序的序列。Excel中將數據按照名稱進行升序降序排列就是一種常見的排序操作。 相關概念 時間複雜度:反映操作次數(計算量)隨數據長度的變化規律,是

原创 排序算法(3):插入排序

基本思想   在玩撲克牌的時候,每當抽到一張牌的時候,就將其插入到手中已經有序的拍中,插入排序和這種整理撲克牌的思路很像。每遍歷到一個新的元素就將其插入到它之前的所有元素中的合適位置,保證其之前的序列有序。 算法流程 第一趟排序

原创 排序算法(4):希爾排序

基本思想 h有序數組 一個數組中任意間隔爲 hhh 的元素都是有序的,那這個數組就是h有序數組。如下圖所示這個數組就是一個 hhh 有序數組,其中 h=4h=4h=4。可以看到,雖然整個數組是亂序的,但任意相隔 h=4h=4h

原创 排序算法(8):計數排序/桶排序/基數排序

  計數排序、桶排序和基數排序是三個線性時間非比較類排序算法,他們相同的特點在於不是通過比較元素的大小來確定他們的排列順序,並且均能夠達到線性時間複雜度O(n+k)O(n+k)O(n+k),之所以這樣根本在於他們都使用了額外的桶(

原创 排序算法(6):快速排序

基本思想   快速排序也是一種基於分治的排序算法,它的主要思想是將一個數組切分成兩部分,將這兩部分獨立的進行排序。和歸併排序不同的是:歸併排序首先對兩部分子數組進行排序,在子數組各自有序之後將他們合併爲一個完整的有序數組;而快速排

原创 排序算法(7):堆排序

基本思想   堆排序是基於堆這種數據結構的一種排序方法。首先將待排序的數組(或序列)構造成完全二叉樹,然後利用完全二叉樹中父節點和孩子節點之間的關係,每次從當前二叉樹中找出最大節點並將其移出未排序部分,達到排序的目的。首先介紹一下

原创 排序算法(5):歸併排序

基本思想   用一句話描述歸併排序就是:將兩個有序的數組歸併(Merge)爲一個有序數組。歸併排序是分治思想的一種典型應用。歸併排序可以通過自頂向下的方式實現,也可以通過自底向上的方式實現。 自頂向下 自頂向下的歸併排序首先將