演算法的編程實現
圖的遍歷是指按某條搜索路徑訪問圖中每個結點,使得每個結點均被訪問一次,而且僅被訪問一次。圖的遍歷有深度遍歷演算法和廣度遍歷演算法,最近阿傑做了關於圖的遍歷的演算法,下面是圖的遍歷深度優先的演算法(C語言程序):
#include<stdio.h>
#include<malloc.h>
#define MaxVertexNum 5
#define m 5
#define TRUE 1
#define NULL 0
typedef struct node
{
int adjvex;
struct node *next;
}JD;
typedef struct EdgeNode
{
int vexdata;
JD *firstarc;
}TD;
typedef struct
{
TD ag[m];
int n;
}ALGRAPH;
void DFS(ALGRAPH *G,int i)
{
JD *p;
int visited[80];
printf("visit vertex:%d->",G->ag[i].vexdata);
visited[i]=1;
p=G->ag[i].firstarc;
while(p)
{
if (!visited[p->adjvex])
DFS(G,p->adjvex);
p=p->next;
}
}
void creat(ALGRAPH *G)
{
int i,m1,j;
JD *p,*p1;
printf("please input the number of graph\n");
scanf("%d",&G->n);
for(i=0;i<G->n;i++)
{
printf("please input the info of node %d",i);
scanf("%d",&G->ag[i].vexdata);
printf("please input the number of arcs which adj to %d",i);
scanf("%d",&m1);
printf("please input the adjvex position of the first arc\n");
p=(JD *)malloc(sizeof(JD));
scanf("%d",&p->adjvex);
p->next=NULL;
G->ag[i].firstarc=p;
p1=p;
for(j=2 ;j<=m1;j++)
{
printf("please input the position of the next arc vexdata\n");
p=(JD *)malloc(sizeof(JD));
scanf("%d",&p->adjvex);
p->next=NULL;
p1->next=p;
p1=p;
}
}
}
int visited[MaxVertexNum];
void DFSTraverse(ALGRAPH *G)
{
int i;
for(i=0;i<G->n;i++)
visited[i]=0;
for(i=0;i<G->n;i++)
if(!visited[i])
DFS(G,i);
}
int main()
{
ALGRAPH *G;
printf("下面以臨接表存儲一個圖;\n");
creat(G);
printf("下面以深度優先遍歷該圖 \n");
DFSTraverse(G);
getchar();
}
B. 如何利用python語言實現機器學習演算法
基於以下三個原因,我們選擇Python作為實現機器學習演算法的編程語言:(一) Python的語法清晰;(二) 易於操作純文本文件;(三) 使用廣泛,存在大量的開發文檔。 可執行偽代碼 Python具有清晰的語法結構,大家也把它稱作可執行偽代碼(executable pseudo-code)。默認安裝的Python開發環境已經附帶了很多高級數據類型,如列表、元組、字典、集合、隊列等,無需進一步編程就可以使用這些數據類型的操作。使用這些數據類型使得實現抽象的數學概念非常簡單。此外,讀者還可以使用自己熟悉的編程風格,如面向對象編程、面向過程編程、或者函數式編程。不熟悉Python的讀者可以參閱附錄A,該附錄詳細介紹了Python語言、Python使用的數據類型以及安裝指南。 Python語言處理和操作文本文件非常簡單,非常易於處理非數值型數據。Python語言提供了豐富的正則表達式函數以及很多訪問Web頁面的函數庫,使得從HTML中提取數據變得非常簡單直觀。 Python比較流行 Python語言使用廣泛,代碼範例也很多,便於讀者快速學習和掌握。此外,在開發實際應用程序時,也可以利用豐富的模塊庫縮短開發周期。 在科學和金融領域,Python語言得到了廣泛應用。SciPy和NumPy等許多科學函數庫都實現了向量和矩陣操作,這些函數庫增加了代碼的可讀性,學過線性代數的人都可以看懂代碼的實際功能。另外,科學函數庫SciPy和NumPy使用底層語言(C和Fortran)編寫,提高了相關應用程序的計算性能。本書將大量使用Python的NumPy。 Python的科學工具可以與繪圖工具Matplotlib協同工作。Matplotlib可以繪制二D、三D圖形,也可以處理科學研究中經常使用到的圖形,所以本書也將大量使用Matplotlib。 Python開發環境還提供了互動式shell環境,允許用戶開發程序時查看和檢測程序內容。 Python開發環境將來還會集成Pylab模塊,它將NumPy、SciPy和Matplotlib合並為一個開發環境。在本書寫作時,Pylab還沒有並入Python環境,但是不遠的將來我們肯定可以在Python開發環境找到它。 Python語言的特色 諸如MATLAB和Mathematica等高級程序語言也允許用戶執行矩陣操作,MATLAB甚至還有許多內嵌的特徵可以輕松地構造機器學習應用,而且MATLAB的運算速度也很快。然而MATLAB的不足之處是軟體費用太高,單個軟體授權就要花費數千美元。雖然也有適合MATLAB的第三方插件,但是沒有一個有影響力的大型開源項目。 Java和C等強類型程序設計語言也有矩陣數學庫,然而對於這些程序設計語言來說,最大的問題是即使完成簡單的操作也要編寫大量的代碼。程序員首先需要定義變數的類型,對於Java來說,每次封裝屬性時還需要實現getter和setter方法。另外還要記著實現子類,即使並不想使用子類,也必須實現子類方法。為了完成一個簡單的工作,我們必須花費大量時間編寫了很多無用冗長的代碼。Python語言則與Java和C完全不同,它清晰簡練,而且易於理解,即使不是編程人員也能夠理解程序的含義,而Java和C對於非編程人員則像天書一樣難於理解。 所有人在小學二年級已經學會了寫作,然而大多數人必須從事其他更重要的工作。 ——鮑比·奈特 也許某一天,我們可以在這句話中將「寫作」替代為「編寫代碼」,雖然有些人對於編寫代碼很感興趣,但是對於大多數人來說,編程僅是完成其他任務的工具而已。Python語言是高級編程語言,我們可以花費更多的時間處理數據的內在含義,而無須花費太多精力解決計算機如何得到數據結果。Python語言使得我們很容易表達自己的目的。 Python語言的缺點 Python語言唯一的不足是性能問題。Python程序運行的效率不如Java或者C代碼高,但是我們可以使用Python調用C編譯的代碼。這樣,我們就可以同時利用C和Python的優點,逐步地開發機器學習應用程序。我們可以首先使用Python編寫實驗程序,如果進一步想要在產品中實現機器學習,轉換成C代碼也不困難。如果程序是按照模塊化原則組織的,我們可以先構造可運行的Python程序,然後再逐步使用C代碼替換核心代碼以改進程序的性能。C++ Boost庫就適合完成這個任務,其他類似於Cython和PyPy的工具也可以編寫強類型的Python代碼,改進一般Python程序的性能。 如果程序的演算法或者思想有缺陷,則無論程序的性能如何,都無法得到正確的結果。如果解決問題的思想存在問題,那麼單純通過提高程序的運行效率,擴展用戶規模都無法解決這個核心問題。從這個角度來看,Python快速實現系統的優勢就更加明顯了,我們可以快速地檢驗演算法或者思想是否正確,如果需要,再進一步優化代碼
C. c語言 編程實現SAM演算法。。
思路:
反余玄函數,通過引入math.h頭文件,使用double acos(double x) 函數計算
每次求和利用for循環依次計算即可
D. 用C語言編程實現下列演算法!謝謝!
NOIP(全國信息學奧林匹克聯賽)1997
普及組
二、把1,2,…
9共9個數排成下列形狀的三角形:(30%)
a
b
c
d
e
f
g
h
i
其中:a~i分別表示1,2,...9中的一個數字,並要求同時滿足下列條件:
(1)
a<f<i
(2)b<d,
g<h,
c<e;
(3)a+b+d+f=
f+g+h+i=
i+e+c+a=
P
程序要求:根據輸入的邊長之和P,輸出所有滿足上述條件的三角形的個數及其中的一
種方案。
在演算法描述中,如果隊循環變數的初值和終值精心設置,是可以體現出變數間規定的一些大小關系的,這樣做可以減少IF語句,減少運行時間。
參考代碼:
#include<iostream>
using
namespace
std;
int
main()
{
bool
z[10]={};
int
a,b,c,d,e,f,g,h,i,p,s=0,x,y;
cin>>p;
for(a=1;a<8;z[a++]=false)
{
z[a]=true;
y=p-5-a<8?p-a-5:8;
for(f=a+1;f<=y;f++)
{
z[f]=true;
x=p-f-3<9?p-f-3:9;
for(i=f+1;i<=x;i++)
{
z[i]=true;
for(b=1;b<=(p-a-f-1)/2;b++)
{
d=p-a-f-b;
if(z[b]||d>9||z[d])continue;
z[b]=z[d]=true;
for(c=1;c<=(p-i-a-1)/2;c++)
{
e=p-a-c-i;
if(z[c]||e>9||z[e])continue;
z[c]=z[e]=true;
for(g=1;g<=(p-f-i-1)/2;g++)
{
h=p-f-g-i;
if(z[g]||h>9||z[h])continue;
if(s++==0)cout<<a<<endl<<b<<c<<endl<<p-a-f-b<<p-a-c-i<<endl<<f<<g<<p-f-i-g<<i<<endl;
}
z[c]=z[e]=false;
}
z[b]=z[d]=false;
}
z[i]=0;
}
z[f]=0;
}
z[a]=0;
}
cout<<s<<endl;
return
0;
}
E. 請編程實現一個冒泡排序演算法
演算法思想簡單描述:
在要排序的一組數中,對當前還未排好序的范圍內的全部數,自上
而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較
小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要
求相反時,就將它們互換。
下面是一種改進的冒泡演算法,它記錄了每一遍掃描後最後下沉數的
位置k,這樣可以減少外層循環掃描的次數。
冒泡排序是穩定的。演算法時間復雜度O(n^2)
演算法實現:
/*
功能:冒泡排序
輸入:數組名稱(也就是數組首地址)、數組中元素個數
*/
void bubble_sort(int *x, int n)
{
int j, k, h, t;
for (h=n-1; h>0; h=k) /*循環到沒有比較范圍*/
{
for (j=0, k=0; j<h; j++) /*每次預置k=0,循環掃描後更新k*/
{
if (*(x+j) > *(x+j+1)) /*大的放在後面,小的放到前面*/
{
t = *(x+j);
*(x+j) = *(x+j+1);
*(x+j+1) = t; /*完成交換*/
k = j; /*保存最後下沉的位置。這樣k後面的都是排序排好了的。*/
}
}
}
}
F. 用C語言編程實現快速排序演算法
給個快速排序你參考參考
/**********************快速排序****************************
基本思想:在待排序的n個記錄中任取一個記錄(通常取第一個記錄),
以該記錄為基準,將當前的無序區劃分為左右兩個較小的無
序子區,使左邊的記錄均小於基準值,右邊的記錄均大於或
等於基準值,基準值位於兩個無序區的中間位置(即該記錄
最終的排序位置)。之後,分別對兩個無序區進行上述的劃
分過程,直到無序區所有記錄都排序完畢。
*************************************************************/
/*************************************************************
函數名稱:staticvoidswap(int*a,int*b)
參數:int*a---整型指針
int*b---整型指針
功能:交換兩個整數的位置
返回值:無
說明:static關鍵字指明了該函數只能在本文件中使用
**************************************************************/
staticvoidswap(int*a,int*b)
{
inttemp=*a;
*a=*b;
*b=temp;
}
intquickSortNum=0;//快速排序演算法所需的趟數
/*************************************************************
函數名稱:staticintpartition(inta[],intlow,inthigh)
參數:inta[]---待排序的數據
intlow---無序區的下限值
inthigh---無序區的上限值
功能:完成一趟快速排序
返回值:基準值的最終排序位置
說明:static關鍵字指明了該函數只能在本文件中使用
**************************************************************/
staticintpartition(inta[],intlow,inthigh)
{
intprivotKey=a[low];//基準元素
while(low<high)
{//從表的兩端交替地向中間掃描
while(low<high&&a[high]>=privotKey)//找到第一個小於privotKey的值
high--;//從high所指位置向前搜索,至多到low+1位置
swap(&a[low],&a[high]);//將比基準元素小的交換到低端
while(low<high&&a[low]<=privotKey)//找到第一個大於privotKey的值
low++;//從low所指位置向後搜索,至多到high-1位置
swap(&a[low],&a[high]);//將比基準元素大的交換到高端
}
quickSortNum++;//快速排序趟數加1
returnlow;//返回基準值所在的位置
}
/*************************************************************
函數名稱:voidQuickSort(inta[],intlow,inthigh)
參數:inta[]---待排序的數據
intlow---無序區的下限值
inthigh---無序區的上限值
功能:完成快速排序演算法,並將排序完成的數據存放在數組a中
返回值:無
說明:使用遞歸方式完成
**************************************************************/
voidQuickSort(inta[],intlow,inthigh)
{
if(low<high)
{
intprivotLoc=partition(a,low,high);//將表一分為二
QuickSort(a,low,privotLoc-1);//遞歸對低子表遞歸排序
QuickSort(a,privotLoc+1,high);//遞歸對高子表遞歸排序
}
}
G. C語言 指針和函數編程實現折半查找演算法
//二分法查找演算法
intbinary_search(intarr[],int*top,int*bot,intx){
if(*bot>=*top){
intindex=*top+(*bot-*top)/2;
int*mid=&index;
if(arr[*mid]==x)return*mid;
if(arr[*mid]>x){//x在左側
*mid=*mid-1;
returnbinary_search(arr,top,mid,x);
}
else{//x在右側
*mid=*mid+1;
returnbinary_search(arr,mid,bot,x);
}
}
return-1;
}
voidmain()
{
inta[10]={1,3,5,7,8,9,12,13,15,17};
intn=sizeof(a)/sizeof(a[0]),x=13,t=0;
int*top=&t,*bot=&n;
*bot=*bot-1;
intindex=binary_search(a,top,bot,x);
if(index>=0){
printf("%d在數組索引為[%d]的位置 ",x,index);
}
else{
printf("%d在數組中不存在! ",x);
}
}
H. 演算法編程:用c語言實現
解決這類問題可以使用 回溯 演算法,代碼如下:
#include<stdio.h>
#include<stdlib.h>
#defineM6//候選數字個數
#defineN5//組合後數字位數
intcheck(intresult[],inti)
{
for(intj=0;j<N;j++)
if(result[j]==i)
return0;
return1;
}
intlist(intnumbers[],intl,intresult[],intcount)
{
if(l>=N){
//將各位數組合成一個數
intnum=0;
for(inti=0;i<N;i++){
num=num*10+numbers[result[i]];
}
//判斷這個數是否能被75整除
if(num%75==0){
printf("%d ",num);
count++;
}
returncount;
}
for(inti=0;i<M;i++){
if(!check(result,i)){
continue;
}
result[l]=i;
count=list(numbers,l+1,result,count);
result[l]=-1;
}
returncount;
}
intmain()
{
intnumbers[M]={1,2,5,7,8,9};
intresult[N]={-1,-1,-1,-1,-1};
intcount=list(numbers,0,result,0);
printf("共有%d個 ",count);
system("pause");
return0;
}
運行結果:
I. voronoi圖的演算法編程實現
輸入:點集S
=
{p1,
p2,
…,
pn}。
1.
任取pi,
pj,
pk三點連成三角形
2.
求出此三角形的外心v和半徑d
3.
對圖中點計算距離d(pr,
v),r=1…n並據此將各點排序,得到p1,
p2,
…,
pn-3。l←1。
4.
if
d(pl,
v)>d
then
goto
6
5.
改取pl,
pi,
pj組成三角形。若有多點滿足d(pl,
v)<d,則取p1,
p2,
p3連成三角形。goto
2
6.
判定pl在已有哪條有向邊或哪兩條有向邊右側
7.
修改pl所在多邊形的邊界及頂點
8.
l←l+1,goto
6
直到l>n-3
步驟1,2,4,5,7時間為常數;步驟3要求n-3次計算距離及nlogn次比較;步驟5到步驟2的循環為常數次,步驟6需要O(n)次計算,步驟8
循環n-3次,代價3+4+…+n-1
=
O(n2),總時間復雜性為O(n2)。
或者
1.
劃分S為規模近似相等的子集S1,
S2
2.
遞歸地構造Vor
(S1)和Vor(S2)
3.
構造折線B分開S1,
S2,使得對B上任一點v及S1中的點a和S2中的點b,有d(a,
v)=d(b,
v)。
4.
刪去B左側的Vor(S2)的所有邊和位於B右側的Vor
(S1)的所有邊,得到Vor(S)
J. 如何編程實現演算法時間復雜度計算
關於時間復雜度的計算是按照運算次數來進行的,比如1題:
sum1(intn)
{intp=1,sum=0,m;//1次
for(m=1;m<=n;m++)//n+1次
{p*=m;//n次
sum+=p;}//n次
return(sum);//1次
}
最後總的次數為
1+(n+1)+n+n+1+1=3n+3
所以時間復雜度f(o)=n;(時間復雜度只管n的最高次方,不管他的系數和表達式中的常量)
其餘的一樣,不明白的可以來問我