当前位置:首页 » 编程软件 » 算法的编程实现

算法的编程实现

发布时间: 2022-09-10 02:11:54

A. 用c语言编程实现图的遍历算法

图的遍历是指按某条搜索路径访问图中每个结点,使得每个结点均被访问一次,而且仅被访问一次。图的遍历有深度遍历算法和广度遍历算法,最近阿杰做了关于图的遍历的算法,下面是图的遍历深度优先的算法(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算法。。

思路:

  1. 反余玄函数,通过引入math.h头文件,使用double acos(double x) 函数计算

  2. 每次求和利用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的最高次方,不管他的系数和表达式中的常量)
其余的一样,不明白的可以来问我

热点内容
linux查看用户与组 发布:2025-04-01 07:08:27 浏览:421
安卓大屏导航怎么改回中文 发布:2025-04-01 07:07:05 浏览:499
单机奥德赛需要什么配置 发布:2025-04-01 07:05:33 浏览:903
专属云服务器如何注册 发布:2025-04-01 07:03:23 浏览:763
java编程的培训机构 发布:2025-04-01 06:57:40 浏览:780
sqlserver百度云 发布:2025-04-01 06:57:35 浏览:615
11点关闭游戏服务器有什么影响 发布:2025-04-01 06:51:54 浏览:559
转发赚钱源码 发布:2025-04-01 06:50:28 浏览:906
php对象编程 发布:2025-04-01 06:38:41 浏览:333
c语言了5 发布:2025-04-01 06:36:19 浏览:143