當前位置:首頁 » 操作系統 » c演算法精解

c演算法精解

發布時間: 2023-03-17 14:17:00

c語言演算法有哪些

這里整理c語言常用演算法,主要有:
交換演算法
查找最小值演算法
冒泡排序
選擇排序
插入排序
shell排序 (希爾排序)
歸並排序
快速排序
二分查找演算法
查找重復演算法

⑵ c(n,r)怎麼算

C(m,n)其中m是下標,n是上標,計算為3!/10!,這里!是連乘的意思.例如3!=3*2*1,10!=10*9*8*7*6*5*4*3*2*1

⑶ 求漢諾塔C遞歸演算法詳細解答

Hanoi塔問題, 演算法分析如下,設A上有n個盤子。
如果n=1,則將圓盤從A直接移動到C。
如果n=2,則:
(1)將A上的n-1(等於1)個圓盤移到B上;
(2)再將A上的一個圓盤移到C上;
(3)最後將B上的n-1(等於1)個圓盤移到C上。
如果n=3,則:
A)將A上的n-1(等於2,令其為n`)個圓盤移到B(藉助於C),步驟如下:
(1)將A上的n`-1(等於1)個圓盤移到C上。
(2)將A上的一個圓盤移到B。
(3)將C上的n`-1(等於1)個圓盤移到B。
B)將A上的一個圓盤移到C。
C)將B上的n-1(等於2,令其為n`)個圓盤移到C(藉助A),步驟如下:
(1)將B上的n`-1(等於1)個圓盤移到A。
(2)將B上的一個盤子移到C。
(3)將A上的n`-1(等於1)個圓盤移到C。到此,完成了三個圓盤的移動過程。

從上面分析可以看出,當n大於等於2時, 移動的過程可分解為三個步驟:第一步 把A上的n-1個圓盤移到B上;第二步 把A上的一個圓盤移到C上;第三步 把B上的n-1個圓盤移到C上;其中第一步和第三步是類同的。 當n=3時,第一步和第三步又分解為類同的三步,即把n`-1個圓盤從一個針移到另一個針上,這里的n`=n-1。

Hanoi塔問題中函數調用時系統所做工作

一個函數在運行期調用另一個函數時,在運行被調用函數之前,系統先完成3件事:

①將所有的實參、返回地址等信息傳遞給被調用函數保存。

②為被調用函數的局部變數分配存儲區;

③將控制轉移到被調用函數的入口。

從被調用函數返回調用函數前,系統也應完成3件事:

①保存被調用函數的結果;

②釋放被調用函數的數據區;

③依照被調用函數保存的返回地址將控制轉移到調用函數。

當有多個函數構成嵌套調用時,按照「後調用先返回」的原則(LIFO),上述函數之間的信息傳遞和控制轉移必須通過「棧」來實現,即系統將整個程序運行時所需的數據空間安排在一個棧中,每當調用一個函數時,就為其在棧頂分配一個存儲區,每當從一個函數退出時,就釋放其存儲區,因此當前運行函數的數據區必在棧頂。堆棧特點:LIFO,除非轉移或中斷,堆棧內容的存或取表現出線性表列的性質。正是如此,程序不要求跟蹤當前進入堆棧的真實單元,而只要用一個具有自動遞增或自動遞減功能的堆棧計數器,便可正確指出最後一次信息在堆棧中存放的地址。

一個遞歸函數的運行過程類型於多個函數的嵌套調用,只是調用函數和被調用函數是同一個函數。因此,和每次調用相關的一個重要的概念是遞歸函數運行的「層次」。假設調用該遞歸函數的主函數為第0層,則從主函數調用遞歸函數為進入第1層;從第i層遞歸調用本函數為進入下一層,即i+1層。反之,退出第i層遞歸應返回至上一層,即i-1層。為了保證遞歸函數正確執行,系統需設立一個「遞歸工作棧」,作為整個遞歸函數運行期間使用的數據存儲區。每一層遞歸所需信息構成一個「工作記錄」,其中包括所有實參、所有局部變數以及上一層的返回地址。每進入一層遞歸,就產生一個新的工作記錄壓入棧頂。每退出一層遞歸,就從棧頂彈出一個工作記錄,則當前執行層的工作記錄必是遞歸工作棧棧頂的工作記錄,稱這個記錄為「活動記錄」,並稱指示活動記錄的棧頂指針為「當前環境指針」。
P.S.代碼如您寫的。

⑷ C語言哈希結構插入問題

(散列表)(插入(創建)、查找

⑸ C語言演算法  求1+2+3+4+5........+100

這個問題有2種解法.
解法1:根據條件給出循環求解
#include
<stdio.h>
void
main()
{
int
i;
int
sum=0;
for(i=1;i<=100;i++)
{
sum+=i;
}
printf("1+2+3+4....+100的值為:%d\n",sum);
}
解法2:根據數學原理,找出前N項和的公式
(n*(n+1))/2,這是根據復雜度方面考慮的,沒有循環減少運行時間,提高效率.
#include
<stdio.h>
void
main()
{
int
i;
int
sum=0;
printf("請輸入要加到的數字:\n");
scanf("%d",&i);
sum
=
(i*(i+1))/2;
printf("值為:%d\n",sum);
}

⑹ 大數據經典演算法解析(1)一C4.5演算法

姓名:崔升    學號:14020120005

【嵌牛導讀】:

C4.5作為一種經典的處理大數據的演算法,是我們在學習互聯網大數據時不得不去了解的一種常用演算法

【嵌牛鼻子】:經典大數據演算法之C4.5簡單介紹

【嵌牛提問】:C4.5是一種怎麼的演算法,其決策機制靠什麼實現?

【嵌牛正文】:

決策樹模型:

決策樹是一種通過對特徵屬性的分類對樣本進行分類的樹形結構,包括有向邊與三類節點:

根節點(root node),表示第一個特徵屬性,只有出邊沒有入邊;

內部節點(internal node),表示特徵屬性,有一條入邊至少兩條出邊

葉子節點(leaf node),表示類別,只有一條入邊沒有出邊。

上圖給出了(二叉)決策樹的示例。決策樹具有以下特點:

對於二叉決策樹而言,可以看作是if-then規則集合,由決策樹的根節點到葉子節點對應於一條分類規則;

分類規則是 互斥並且完備 的,所謂 互斥 即每一條樣本記錄不會同時匹配上兩條分類規則,所謂 完備 即每條樣本記錄都在決策樹中都能匹配上一條規則。

分類的本質是對特徵空間的劃分,如下圖所示,

決策樹學習:

決策樹學習的本質是從訓練數據集中歸納出一組分類規則[2]。但隨著分裂屬性次序的不同,所得到的決策樹也會不同。如何得到一棵決策樹既對訓練數據有較好的擬合,又對未知數據有很好的預測呢?

首先,我們要解決兩個問題:

如何選擇較優的特徵屬性進行分裂?每一次特徵屬性的分裂,相當於對訓練數據集進行再劃分,對應於一次決策樹的生長。ID3演算法定義了目標函數來進行特徵選擇。

什麼時候應該停止分裂?有兩種自然情況應該停止分裂,一是該節點對應的所有樣本記錄均屬於同一類別,二是該節點對應的所有樣本的特徵屬性值均相等。但除此之外,是不是還應該其他情況停止分裂呢?

2. 決策樹演算法

特徵選擇

特徵選擇指選擇最大化所定義目標函數的特徵。下面給出如下三種特徵(Gender, Car Type, Customer ID)分裂的例子:

圖中有兩類類別(C0, C1),C0: 6是對C0類別的計數。直觀上,應選擇Car Type特徵進行分裂,因為其類別的分布概率具有更大的傾斜程度,類別不確定程度更小。

為了衡量類別分布概率的傾斜程度,定義決策樹節點tt的不純度(impurity),其滿足:不純度越小,則類別的分布概率越傾斜;下面給出不純度的的三種度量:

其中,p(ck|t)p(ck|t)表示對於決策樹節點tt類別ckck的概率。這三種不純度的度量是等價的,在等概率分布是達到最大值。

為了判斷分裂前後節點不純度的變化情況,目標函數定義為信息增益(information gain):

I(⋅)I(⋅)對應於決策樹節點的不純度,parentparent表示分裂前的父節點,NN表示父節點所包含的樣本記錄數,aiai表示父節點分裂後的某子節點,N(ai)N(ai)為其計數,nn為分裂後的子節點數。

特別地,ID3演算法選取 熵值 作為不純度I(⋅)I(⋅)的度量,則

cc指父節點對應所有樣本記錄的類別;AA表示選擇的特徵屬性,即aiai的集合。那麼,決策樹學習中的信息增益ΔΔ等價於訓練數據集中 類與特徵的互信息 ,表示由於得知特徵AA的信息訓練數據集cc不確定性減少的程度。

在特徵分裂後,有些子節點的記錄數可能偏少,以至於影響分類結果。為了解決這個問題,CART演算法提出了只進行特徵的二元分裂,即決策樹是一棵二叉樹;C4.5演算法改進分裂目標函數,用信息增益比(information gain ratio)來選擇特徵:

因而,特徵選擇的過程等同於計算每個特徵的信息增益,選擇最大信息增益的特徵進行分裂。此即回答前面所提出的第一個問題(選擇較優特徵)。ID3演算法設定一閾值,當最大信息增益小於閾值時,認為沒有找到有較優分類能力的特徵,沒有往下繼續分裂的必要。根據最大表決原則,將最多計數的類別作為此葉子節點。即回答前面所提出的第二個問題(停止分裂條件)。

決策樹生成:

ID3演算法的核心是根據信息增益最大的准則,遞歸地構造決策樹;演算法流程如下:

如果節點滿足停止分裂條件(所有記錄屬同一類別 or 最大信息增益小於閾值),將其置為葉子節點;

選擇信息增益最大的特徵進行分裂;

重復步驟1-2,直至分類完成。

C4.5演算法流程與ID3相類似,只不過將信息增益改為 信息增益比 。

3. 決策樹剪枝

過擬合

生成的決策樹對訓練數據會有很好的分類效果,卻可能對未知數據的預測不準確,即決策樹模型發生過擬合(overfitting)——訓練誤差(training error)很小、泛化誤差(generalization error,亦可看作為test error)較大。下圖給出訓練誤差、測試誤差(test error)隨決策樹節點數的變化情況:

可以觀察到,當節點數較小時,訓練誤差與測試誤差均較大,即發生了欠擬合(underfitting)。當節點數較大時,訓練誤差較小,測試誤差卻很大,即發生了過擬合。只有當節點數適中是,訓練誤差居中,測試誤差較小;對訓練數據有較好的擬合,同時對未知數據有很好的分類准確率。

發生過擬合的根本原因是分類模型過於復雜,可能的原因如下:

訓練數據集中有噪音樣本點,對訓練數據擬合的同時也對噪音進行擬合,從而影響了分類的效果;

決策樹的葉子節點中缺乏有分類價值的樣本記錄,也就是說此葉子節點應被剪掉。

剪枝策略

為了解決過擬合,C4.5通過剪枝以減少模型的復雜度。[2]中提出一種簡單剪枝策略,通過極小化決策樹的整體損失函數(loss function)或代價函數(cost function)來實現,決策樹TT的損失函數為:

其中,C(T)C(T)表示決策樹的訓練誤差,αα為調節參數,|T||T|為模型的復雜度。當模型越復雜時,訓練的誤差就越小。上述定義的損失正好做了兩者之間的權衡。

如果剪枝後損失函數減少了,即說明這是有效剪枝。具體剪枝演算法可以由動態規劃等來實現。

4. 參考資料

[1] Pang-Ning Tan, Michael Steinbach, Vipin Kumar, Introction to Data Mining .

[2] 李航,《統計學習方法》.

[3] Naren Ramakrishnan, The Top Ten Algorithms in Data Mining.

⑺ C語言演算法 誰能給我具體講一下這段話的意思,入門ING,謝謝!

讓手罩p=1,i=2,做第一次乘法,隱薯洞該寫灶枯成p=p*i;這樣運算結果就賦給了p;然後讓i加1,得到3,再作p=p*i;這樣就等於完成了1*2*3,再讓i加1……如此做下去,每次運算只要讓i+1,然後讓p=p*i,直到i=5時不再運算就行了。每次的運算一樣,就可以用一個循環語句實現,for語句,do-while語句,while語句等……
這樣說能明白么?

⑻ 詳解C語言演算法

完整的程序如下:
typedef int status;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 10
#include<stdarg.h>
#include<iostream.h>
#include<stdlib.h>
typedef int ElemType;
#define MAXDIM 8
typedef struct{
ElemType * base;
int dim;
int *bounds;
int *constants;
}Array;

status InitArray(Array &A,int dim,...)
{va_list ap;
if(dim<1||dim>MAXDIM) return ERROR;
A.dim=dim;
int i;
int total=1;
A.bounds=(int *)malloc(dim*sizeof(int));
if(!A.bounds) return ERROR;
va_start(ap,dim);
for(i=0;i<dim;i++)
{A.bounds[i]=va_arg(ap,int);
if(A.bounds[i]<0) return ERROR;
total*=A.bounds[i];
}
va_end(ap);
A.base=(ElemType*)malloc(total*sizeof(ElemType));
if(!A.base) return ERROR;
A.constants=(int *)malloc(dim*sizeof(int));
if(!A.constants) return ERROR;
A.constants[dim-1]=1;
for(i=dim-2;i>=0;i--)
A.constants[i]=A.constants[i+1]*A.bounds[i+1];
return OK;
}

status DestoryArray(Array &A)
{if(!A.base) return ERROR;
free(A.base);
if(!A.bounds) return ERROR;
free(A.bounds);
if(!A.constants) return ERROR;
free(A.constants);
A.dim=0;
return OK;
}

status Locate(Array A,int & off,...)
{va_list ap;
va_start(ap,off);
off=0;
int ind;
int i;
for(i=0;i<A.dim;i++)
{ind=va_arg(ap,int);
if(ind>A.bounds[i]||ind<0) return ERROR;
off+=ind*A.constants[i];
}
va_end(ap);
return OK;
}

status Value(Array A,ElemType & e,...)
{int off;
va_list ap;
va_start(ap,e);
Locate(A,off,ap);
e=A.base[off];
va_end(ap);
return OK;
}

status Assign(Array A,ElemType e,...)
{int off;
va_list ap;
va_start(ap,e);
Locate(A,off,ap);
A.base[off]=e;
va_end(ap);
return OK;
}
int main()
{Array A;
InitArray(A,2,2,5);
int i;
for(i=0;i<10;i++)
{ cout<<"請輸入數據"<<endl;
cin>>A.base[i];
}

ElemType e;
int off;
Locate(A,off,2,3);
cout<<"偏移是"<<off<<endl;
Value(A,e,2,4);
cout<<"第二行第四列是"<<e<<endl;
cin>>e;
Assign(A,e,2,2);
Value(A,e,2,2);
cout<<"第二行第二列是"<<e<<endl;
DestoryArray(A);
return 0;
}

執行InitArray(A,2,2,5)後
A.bounds[0]=2, A.bounds[1]=5
A.constants[1]=1, A.constants[0]=5
並且為A.base分配了10個ElemType型的元素空間

PS:關鍵是搞懂省略號參數列表的用法

⑼ 演算法精解c語言描述這本書怎麼樣

演算法精解:C語言描述》是數據結構和演算法領域的經典之作,全書共分為三部分:第一部分首先介紹了數據結構和演算法的概念,以及使用它們的原因和意義,然後講解了數據結構和演算法中最常用的技術——指針和遞歸,最後還介紹了演算法的分析方法,旨在為讀者學習這本書打下堅實的基礎;第二部分對鏈表、棧、隊列、集合、哈希表、堆、圖等常用數據結構進行了深入闡述;第三部分對排序、搜索數值計算、數據壓縮、數據加密、圖演算法、幾何演算法等經典演算法進行了精闢的分析和講解。

⑽ 求演算法精解C語言描述的源代碼庫文件

參考附件內容。



熱點內容
左端演算法 發布:2025-08-24 21:53:26 瀏覽:525
安卓系統怎麼編譯環境 發布:2025-08-24 21:53:24 瀏覽:778
java轉義符 發布:2025-08-24 21:48:26 瀏覽:64
powershell腳本識別 發布:2025-08-24 21:42:30 瀏覽:966
壓縮機企業 發布:2025-08-24 21:35:14 瀏覽:923
三星證書存儲 發布:2025-08-24 21:29:27 瀏覽:909
古詩文源碼 發布:2025-08-24 21:20:15 瀏覽:399
androidxml字元 發布:2025-08-24 20:47:31 瀏覽:51
php頁面跳轉參數 發布:2025-08-24 20:46:25 瀏覽:827
java的常用設計模式 發布:2025-08-24 20:36:52 瀏覽:310