Time of Update: 2017-02-27
一個複雜的工程通常可以分解成一組小任務的集合,完成這些小任務意味著整個工程的完成。例如,汽車裝配工程可分解為以下任務:將底盤放上裝配線,裝軸,將座位裝在底盤上,上漆,裝刹車,裝門等等。任務之間具有先後關係,例如在裝軸之前必須先將底板放上裝配線。任務的先後順序可用有向圖表示——稱為頂點活動( Activity On Vertex, AOV)網路。有向圖的頂點代表任務,有向邊(i, j) 表示先後關係:任務j 開始前任務i 必須完成。圖1 - 4顯示了六個任務的工程,邊( 1
Time of Update: 2017-02-27
雖然設計一個好的求解演算法更像是一門藝術,而不像是技術,但仍然存在一些行之有效能夠用於解決許多問題的演算法設計方法,你可以使用這些方法來設計演算法,並觀察這些演算法是如何工作的。一般情況下,為了獲得較好的效能,必須對演算法進行細緻的調整。但是在某些情況下,演算法經過調整之後效能仍無法達到要求,這時就必須尋求另外的方法來求解該問題。本章首先引入最佳化的概念,然後介紹一種直觀的問題求解方法:貪婪演算法。最後,應用該演算法給出貨箱裝船問題、背包問題、拓撲排序問題、二分覆蓋問題、最短路徑問題、最小代價產
Time of Update: 2017-02-27
對於給定的n個元素的數組a[0 : n - 1],要求從中找出第k小的元素。當a[0 : n - 1]被排序時,該元素就是a[k - 1]。假設n=8,每個元素有兩個域k e y和I D,其中k e y是一個整數,I D是一個字元。假設這8個元素為[( 1 2 ,a),( 4 ,b),( 5 ,c),( 4 ,d),( 5 ,e),( 1 0 ,f),( 2 ,g),( 2 0 ,h)], 排序後得到數組[( 2 ,g),( 4 ,d),( 4 ,b),( 5 ,c),( 5 ,e),( 1 0
Time of Update: 2017-02-27
分而治之方法還可以用於實現另一種完全不同的排序方法,這種排序法稱為快速排序(quick sort)。在這種方法中, n個元素被分成三段(組):左段l e f t,右段r i g h t和中段m i d d l e。中段僅包含一個元素。左段中各元素都小於等於中段元素,右段中各元素都大於等於中段元素。因此l e f t和r i g h t中的元素可以獨立排序,並且不必對l e f t和r i g h t的排序結果進行合并。m i d d l e中的元素被稱為支點( p i v o t )。圖1 4
Time of Update: 2017-02-27
給定n個點(xi,yi)(1≤i≤n),要求找出其中距離最近的兩個點。例14-7 假設在一片金屬上鑽n個大小一樣的洞,如果洞太近,金屬可能會斷。若知道任意兩個洞的最小距離,可估計金屬斷裂的機率。這種最小距離問題實際上也就是距離最近的點對問題。通過檢查所有的n(n- 1 ) / 2對點,並計算每一對點的距離,可以找出距離最近的一對點。這種方法所需要的時間為(n2 )。我們稱這種方法為直接方法。圖1 4 - 1 3中給出了分而治之求解演算法的虛擬碼。該演算法對於小的問題採用直接方法求解,
Time of Update: 2017-02-27
可以運用分而治之方法來解決排序問題,該問題是將n個元素排成非遞減順序。分而治之方法通常用以下的步驟來進行排序演算法:若n 為1,演算法終止;否則,將這一元素集合分割成兩個或更多個子集合,對每一個子集合分別排序,然後將排好序的子集合歸併為一個集合。假設僅將n個元素的集合分成兩個子集合。現在需要確定如何進行子集合的劃分。一種可能性就是把前面n-
Time of Update: 2017-02-27
殘缺棋盤(defective chessboard)是一個有2k×2k 個方格的棋盤,其中恰有一個方格殘缺。圖2 - 3給出k≤2時各種可能的殘缺棋盤,其中殘缺的方格用陰影表示。注意當k= 0時,僅存在一種可能的殘缺棋盤(如圖1 4 - 3 a所示)。事實上,對於任意k,恰好存在22k 種不同的殘缺棋盤。殘缺棋盤的問題要求用三格板(t r i o m i n o e s)覆蓋殘缺棋盤(如圖1 4 -
Time of Update: 2017-02-27
君主和殖民者們所成功運用的分而治之策略也可以運用到高效率的電腦演算法的設計過程中。本章將首先介紹怎樣在演算法設計領域應用這一古老的策略,然後將利用這一策略解決如下問題:最小最大問題、矩陣乘法、殘缺棋盤、排序、選擇和計算一個幾何問題——找出二維空間中距離最近的兩個點。本章給出了用來分析分而治之演算法複雜性的數學方法,並通過推導最小最大問題和排序問題的複雜性下限來證明分而治之演算法對於求解這兩種問題是最優的(因為演算法的複雜性與下限一致)。2.1
Time of Update: 2017-02-27
函數名與函數指標一 數調用一個通常的函數調用的例子://自行包含 標頭檔void MyFun(int x); //此處的申明也可寫成:void MyFun( int );int main(int argc, char* argv[]){MyFun(10); //這裡是調用MyFun(10);函數return 0;}void MyFun(int x) //這裡定義一個MyFun函數{printf
Time of Update: 2017-02-27
指向另一指標的指標一、針概念:早在本系列第二篇中我就對指標的實質進行了闡述 。今天我們又要學習一個叫做指向另一指標地址的指標。讓我們先回顧一下指標的概念吧!當我 們程式如下申明變數:short int i;char a;short int * pi;程式會 在記憶體某地址空間上為各變數開闢空間,如下圖所示。記憶體位址→6 7 8 9 10 11 12 13 14 15------------------- ---------
Time of Update: 2017-02-27
一、三道考題開講之前,我先請你做三道題目。(嘿嘿,得先把你的頭腦搞昏才行 ……唉呀,誰扔我雞蛋?)1.考題一:程式碼如下:void Exchg1(int x, int y){int tmp;tmp=x;x=y;y=tmp;printf (“x=%d,y=%d\n”,x,y)}void main(){int a=4,b=6;Exchg1 (a,b) ;printf(“a=%d,b=%d\n”,a,b)}輸出的結果 :x=_
Time of Update: 2017-02-27
1 int i 說起你知道我們申明一個變數時象這樣int i ;這個i是可能在它處重新變賦值的。 如下:int i=0;//…i=20;//這裡重新賦值了不過有一天我的程 序可能需要這樣一個變數(暫且稱它變數),在申明時就賦一個初始值。之後我的程式在其它任何處都 不會再去重新對它賦值。那我又應該怎麼辦呢?用const .//**************const int ic =20;//…ic=40;//這樣是不可以的,編譯時間是無法通過,因為我們不能對
Time of Update: 2017-02-27
1.數組元素看下面代碼int i,a[]={3,4,5,6,7,3,7,4,4,6};for (i=0;i<=9;i++){printf ( “%d”, a[i] );}很顯然,它是顯示a 數組的各元素值。我們還可以這樣訪問元素,如下int i,a[]={3,4,5,6,7,3,7,4,4,6};for (i=0;i<=9;i++){printf ( “%d”, *(a+i) );}它的結果和作用完全一樣2.
Time of Update: 2017-02-27
二、指標是什麼東西想說弄懂你不容易啊!我們許多初學指標的人都要這樣的感慨。我常常在思索它,為什麼呢?其實生活中處處都有指標。我們也處處在使用它。有了它我們的生活才更加方便 了。沒有指標,那生活才不方便。不信?你看下面的例子。這是一個生活中的例子:比如說你要 我借給你一本書,我到了你宿舍,但是你人不在宿舍,於是我把書放在你的2層3號的書架上,並寫了一 張紙條放在你的桌上。紙條上寫著:你要的書在第2層3號的書架上。當你回來時,看到這張紙條。你就 知道了我借與你的書放在哪了。你想想看,這張紙條的作用,
Time of Update: 2017-02-27
1.語言中變數的實質要理解C指標,我認為一定要理解C中“變數”的儲存實質, 所以我就從“變數”這個東西開始講起吧!先來理解理解記憶體空間吧!請看下圖:記憶體位址→ 6 7 8 9 10 11 12 13-----------------------------------------------------------------。。。 | | | | | |
Time of Update: 2017-02-27
有些程式在調試、相容性、平台移植等情況下可能想要通過簡單地設定一些參數就產生一個不同的軟體,這當然可以通過變數設定,把所有可能用到的代碼都寫進去,在初始化時配置,但在不同的情況下可能只用到一部分代碼,就沒必要把所有的代碼都寫進去,就可以用條件編譯,通過先行編譯指令設定編譯條件,在不同的需要時編譯不同的代碼。(一)條件編譯方法條件編譯是通過先行編譯指令來實現的,主要方法有:1、#if, #elif, #else, #endif#if 條件 1程式碼片段 1#elif 條件 2程式碼片段 2...#
Time of Update: 2017-02-27
前言上一篇《C和指標》可能對關於C和指標的有些內容沒有說透,下來寫了一個鏈表的實現,當然,也是用C的函數指標來類比OO的結構來做的。鏈表結構本身比較複雜(關於指標的使用方面),所以這個例子可能更清晰一些。之所以選List這個例子來說,是因為大家在學校裡肯定接觸過這個簡單資料結構,從一個比較熟悉的例子入手可能比較容易理解一些。介面定義可以先看看介面的定義,與Java或者C#類似:/* * File: IList.h * Author: juntao.qiu * * Created on May
Time of Update: 2017-02-27
函數名: delay功能: 將程式的執行暫停一段時間(毫秒)用法: void delay(unsigned milliseconds);程式例:/* Emits a 440-Hz tone for 500 milliseconds */#includeint main(void){sound(440);delay(500);nosound();return 0;}函數名: delline功能: 在文字視窗中刪去一行用法: void delline(void);程式例:#includeint
Time of Update: 2017-02-27
函數名: ecvt功能: 把一個浮點數轉換為字串用法: char ecvt(double value, int ndigit, int *decpt, int *sign);程式例:#include#include#includeint main(void){char *string;double value;int dec, sign;int ndig = 10;clrscr();value = 9.876;string = ecvt(value, ndig, &dec,
Time of Update: 2017-02-27
double fabs(double x);返回雙精確度x的絕對值。void far *farcalloc(unsigned long nunits,unsigned long unitsz);堆中給含有nu從遠nits個元素的,每個元素佔用unitsz個位元組長的數組分配存貯區。成功是返回指向新分配的記憶體塊的指標;若存貯空間不夠,返回NULL。unsigned long farcoreleft(void);返回遠堆中未用存貯區的大小。void farfree(void far *block)