小知識點(diǎn)(三)數(shù)據(jù)結(jié)構(gòu)與算法,設(shè)計(jì)模式

迭代和遞歸的特點(diǎn),并比較優(yōu)缺點(diǎn):

(1)定義:

程序調(diào)用自身稱為遞歸。

利用變量的原值推出新值稱為迭代绅这。

(2)優(yōu)缺點(diǎn)

遞歸

優(yōu)點(diǎn):大問題轉(zhuǎn)化為小問題糯累,可以減少代碼量算利,同時(shí)代碼精簡,可讀性好泳姐;

缺點(diǎn):就是遞歸調(diào)用浪費(fèi)了空間效拭,而且遞歸太深容易造成堆棧的溢出。

迭代

優(yōu)點(diǎn):代碼運(yùn)行效率好胖秒,因?yàn)闀r(shí)間只因循環(huán)次數(shù)增加而增加缎患,而且沒有額外的空間開銷;

缺點(diǎn):代碼不如遞歸簡潔

排序算法


穩(wěn)定的排序方式:冒泡排序阎肝,歸并排序较锡,直接插入排序

快速排序:

思路:

1.從序列中挑出一個(gè)元素,作為"基準(zhǔn)"(pivot).

2.把所有比基準(zhǔn)值小的元素放在基準(zhǔn)前面盗痒,所有比基準(zhǔn)值大的元素放在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)蚂蕴,這個(gè)稱為分區(qū)(partition)操作。

3.對每個(gè)分區(qū)遞歸地進(jìn)行步驟1~2俯邓,遞歸的結(jié)束條件是序列的大小是0或1骡楼,這時(shí)整體已經(jīng)被排好序了。

intPartition(intA[],int left, int right)// 劃分函數(shù){

int pivot = A[right];// 這里每次都選擇最后一個(gè)元素作為基準(zhǔn)

int tail = left -1; // tail為小于基準(zhǔn)的子數(shù)組最后一個(gè)元素的索引

for(int i = left; i < right; i++)// 遍歷基準(zhǔn)以外的其他元素? ? {

? ? ? ? if(A[i] <= pivot)// 把小于等于基準(zhǔn)的元素放到前一個(gè)子數(shù)組末尾? ? ? ? {

? ? ? ? ? ? Swap(A, ++tail, i);

? ? ? ? }

? ? }

? ? Swap(A, tail +1, right);// 最后把基準(zhǔn)放到前一個(gè)子數(shù)組的后邊稽鞭,剩下的子數(shù)組既是大于基準(zhǔn)的子數(shù)組

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 該操作很有可能把后面元素的穩(wěn)定性打亂鸟整,所以快速排序是不穩(wěn)定的排序算法returntail +1;// 返回基準(zhǔn)的索引}

voidQuickSort(intA[],int left, int right)

{

? ? if(left >= right)

? ? ? ? return;

?int pivot_index = Partition(A, left, right);// 基準(zhǔn)的索引

QuickSort(A, left, pivot_index -1);

QuickSort(A, pivot_index +1, right);

}

堆排序:

思路:父節(jié)點(diǎn)的值大于它子節(jié)點(diǎn)的值

1.由輸入的無序數(shù)組構(gòu)造一個(gè)最大堆,作為初始的無序區(qū)

2.把堆頂元素(最大值)和堆尾元素互換

3.把堆(無序區(qū))的尺寸縮小1朦蕴,并調(diào)用heapify(A, 0)從新的堆頂元素開始進(jìn)行堆調(diào)整

4.重復(fù)步驟2篮条,直到堆的尺寸為1

void Heapify(intA[],int i, int size)// 從A[i]向下進(jìn)行堆調(diào)整{

? ? int left_child =2* i +1;// 左孩子索引

????int right_child =2* i +2;// 右孩子索引

? ?int max = i;// 選出當(dāng)前結(jié)點(diǎn)與其左右孩子三者之中的最大值if(left_child < size && A[left_child] > A[max])

? ? ? ? max = left_child;

? ? if(right_child < size && A[right_child] > A[max])

? ? ? ? max = right_child;

? ? if(max != i)

? ? {

? ? ? ? Swap(A, i, max);? ? ? ? ? ? ? ? // 把當(dāng)前結(jié)點(diǎn)和它的最大(直接)子節(jié)點(diǎn)進(jìn)行交換

Heapify(A, max, size);// 遞歸調(diào)用弟头,繼續(xù)從當(dāng)前結(jié)點(diǎn)向下進(jìn)行堆調(diào)整? ? }

}intBuildHeap(intA[],int n)// 建堆,時(shí)間復(fù)雜度O(n){

? ? int heap_size = n;

? ? for(int i = heap_size /2-1; i >=0; i--)// 從每一個(gè)非葉結(jié)點(diǎn)開始向下進(jìn)行堆調(diào)整? ? ? ?

?????Heapify(A, i, heap_size);

? ? return heap_size;

}voidHeapSort(intA[],int n)

{

? ? int heap_size = BuildHeap(A, n);// 建立一個(gè)最大堆while(heap_size >1)// 堆(無序區(qū))元素個(gè)數(shù)大于1涉茧,未完成排序? ? {

? ? ? ? // 將堆頂元素與堆的最后一個(gè)元素互換赴恨,并從堆中去掉最后一個(gè)元素

? ? ? ? // 此處交換操作很有可能把后面元素的穩(wěn)定性打亂,所以堆排序是不穩(wěn)定的排序算法

Swap(A,0, --heap_size);

? ? ? ? Heapify(A, 0, heap_size);// 從新的堆頂元素開始向下進(jìn)行堆調(diào)整伴栓,時(shí)間復(fù)雜度O(logn)? ? }

}

歸并排序:

思路:1452排序

先把1452分開伦连,變?yōu)? 4 5 2,第一次結(jié)果為14钳垮,25惑淳,第二次排序結(jié)果為1245.遞歸方式

void MergeSortRecursion(intA[],int left, int right)// 遞歸實(shí)現(xiàn)的歸并排序(自頂向下){

? ? if(left == right)// 當(dāng)待排序的序列長度為1時(shí),遞歸開始回溯饺窿,進(jìn)行merge操作return;

? ? int mid = (left + right) /2;

? ? MergeSortRecursion(A, left, mid);

? ? MergeSortRecursion(A, mid +1, right);

? ? Merge(A, left, mid, right);

}

void Merge(intA[],int left, int mid, int right)// 合并兩個(gè)已排好序的數(shù)組A[left...mid]和A[mid+1...right]{

? ? int len = right - left +1;

? ? int*temp =ne wint[len];// 輔助空間O(n)int index =0;

? ? int i = left;// 前一數(shù)組的起始元素int j = mid +1;// 后一數(shù)組的起始元素while(i <= mid && j <= right)

? ? {

? ? ? ? temp[index++] = A[i] <= A[j] ? A[i++] : A[j++];// 帶等號保證歸并排序的穩(wěn)定性? ? }

? ? while(i <= mid)

? ? {

? ? ? ? temp[index++] = A[i++];

? ? }

? ? while(j <= right)

? ? {

? ? ? ? temp[index++] = A[j++];

? ? }

? ? for(int k =0; k < len; k++)

? ? {

? ? ? ? A[left++] = temp[k];

? ? }

}

單例模式:在內(nèi)部創(chuàng)建一個(gè)實(shí)例歧焦,構(gòu)造器全部設(shè)置為private,所有方法均在該實(shí)例上改動肚医,在創(chuàng)建上要注意類的實(shí)例化只能執(zhí)行一次绢馍,可以采用許多種方法來實(shí)現(xiàn),如Synchronized關(guān)鍵字忍宋,或者利用內(nèi)部類等機(jī)制來實(shí)現(xiàn)痕貌。

較為優(yōu)良的雙重鎖機(jī)制:

public class Singleton {

? ? private volatile static Singleton singleton;?

? ? private Singleton (){}?

? ? public static Singleton getSingleton() {?

? ? if (singleton == null) {?

? ? ? ? synchronized (Singleton.class) {?

? ? ? ? if (singleton == null) {?

? ? ? ? ? ? singleton = new Singleton();?

? ? ? ? }?

? ? ? ? }?

? ? }?

? ? return singleton;?

? ? }? }

建造者模式:?1、需要生成的對象具有復(fù)雜的內(nèi)部結(jié)構(gòu)糠排。 2舵稠、需要生成的對象內(nèi)部屬性本身相互依賴。

使用:一些基本部件不會變入宦,而其組合經(jīng)常變化的時(shí)候哺徊。


適配器模式:使用場景為有動機(jī)地修改一個(gè)正常運(yùn)行的系統(tǒng)的接口,這時(shí)應(yīng)該考慮使用適配器模式乾闰。


適配器模式的作用就是在原來的類上提供新功能落追。主要可分為3種:

類適配:創(chuàng)建新類,繼承源類涯肩,并實(shí)現(xiàn)新接口轿钠,例如

class adapter extend soldClass implements newFunc{}

對象適配:創(chuàng)建新類持源類的實(shí)例,并實(shí)現(xiàn)新接口病苗,例如

class adapter implements newFunc {private old Class oldInstance ;}

接口適配:創(chuàng)建新的抽象類實(shí)現(xiàn)舊接口方法疗垛。例如

abstract class adapter implement soldClassFunc {void newFunc();}

工廠模式:主要解決:主要解決接口選擇的問題。何時(shí)使用:我們明確地計(jì)劃不同條件下創(chuàng)建不同實(shí)例時(shí)硫朦。


裝飾器模式:在不想增加很多子類的情況下擴(kuò)展類贷腕。允許向一個(gè)現(xiàn)有的對象添加新的功能,同時(shí)又不改變其結(jié)構(gòu)

interface Source{ void method();}

public class Decorator implements Source{

? ? private Source source ;

? ? public void decotate1(){

? ? ? ? System.out.println("decorate");

? ? }

? ? @Override

? ? public void method() {

? ? ? ? decotate1();

? ? ? ? source.method();

? ? }

}

觀察者模式:定義對象間的一種一對多的依賴關(guān)系,當(dāng)一個(gè)對象的狀態(tài)發(fā)生改變時(shí)泽裳,所有依賴于它的對象都得到通知并被自動更新瞒斩。

場景:一個(gè)對象(目標(biāo)對象)的狀態(tài)發(fā)生改變,所有的依賴對象(觀察者對象)都將得到通知涮总,進(jìn)行廣播通知胸囱。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市妹卿,隨后出現(xiàn)的幾起案子旺矾,更是在濱河造成了極大的恐慌蔑鹦,老刑警劉巖夺克,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嚎朽,居然都是意外死亡铺纽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門哟忍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狡门,“玉大人,你說我怎么就攤上這事锅很∑淞螅” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵爆安,是天一觀的道長叛复。 經(jīng)常有香客問我,道長扔仓,這世上最難降的妖魔是什么褐奥? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮翘簇,結(jié)果婚禮上撬码,老公的妹妹穿的比我還像新娘。我一直安慰自己版保,他們只是感情好呜笑,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著彻犁,像睡著了一般叫胁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上袖裕,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天曹抬,我揣著相機(jī)與錄音,去河邊找鬼。 笑死谤民,一個(gè)胖子當(dāng)著我的面吹牛堰酿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播张足,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼触创,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了为牍?” 一聲冷哼從身側(cè)響起哼绑,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碉咆,沒想到半個(gè)月后抖韩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疫铜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年茂浮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壳咕。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡席揽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谓厘,到底是詐尸還是另有隱情幌羞,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布竟稳,位于F島的核電站属桦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏住练。R本人自食惡果不足惜地啰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望讲逛。 院中可真熱鬧亏吝,春花似錦、人聲如沸盏混。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽许赃。三九已至止喷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間混聊,已是汗流浹背弹谁。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人预愤。 一個(gè)月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓沟于,卻偏偏與公主長得像,于是被迫代替她去往敵國和親植康。 傳聞我的和親對象是個(gè)殘疾皇子旷太,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容

  • <center>#1 Two Sum</center> link Description:Given an arr...
    鐺鐺鐺clark閱讀 2,137評論 0 3
  • 成果思維 成果思維就是先預(yù)設(shè)結(jié)果的一種思維模式。 成果思維法的核心意義在于: 并不是有了工作才有了成果销睁,而是有...
    我和榕樹閱讀 1,541評論 0 0
  • 寫在前邊的周牙: 人生行走就如同鋪建一座城市的岔道供璧,別人把磚瓦只放在自己將行的腳下,他們知道自己的方向冻记。而我們卻非...
    周牙閱讀 319評論 5 1
  • 說到旅游亦是件美事睡毒,可以領(lǐng)略優(yōu)美風(fēng)景,可以放松身心檩赢,但大多數(shù)人的生活處于忙碌的狀態(tài)吕嘀,很少有時(shí)間出去旅游违寞,...
    儒雅小詩閱讀 203評論 0 0
  • 03節(jié)怎樣治療心腦血管疾舱曷鳌? 中國或日本發(fā)病率最高的是心腦血管疾病趁曼,例如军浆,腦血栓患者。發(fā)病前曾有肢體發(fā)麻挡闰,運(yùn)動不靈...
    道易無成2閱讀 199評論 0 0