当前位置:文档之家› 线性时间选择中位数

线性时间选择中位数

线性时间选择中位数
线性时间选择中位数

湖南涉外经济学院计算机科学与技术专业《算法设计与分析》课程

线性时间选择(中位数)

实验报告

班级:

学号:

姓名:

教师:

成绩:

2012年5月

【实验目的】

1 掌握线性时间选择的基本算法及其应用

2 利用线性时间选择算法找出数组的第k小的数

3 分析实验结果,总结算法的时间和空间复杂度

【系统环境】

Windows7 旗舰版平台

【实验工具】

VC++6.0英文企业版

【问题描述】

描述:随机生成一个长度为n的数组。数组为随机生成,k由用户输入。在随机生成的自然数数组元素找出这n个数的第k小的元素。

例:A[5]={3,20,50,10,21} k=3,则在数组A中第3小的元素为20

【实验原理】

原理:将所有的数(n个),以每5个划分为一组,共[n/5]组(将不足五个的那组忽略);然后用任意一种排序算法(因为只对五个数进行排序,所以任取一种排序法就可以了,这里我选用冒泡排序),将每组中的元素排好序再分别取每组的中位数,得到[n/5]个中位数;再取这[n/5]个中位数的中位数(如果n/5是偶数,就找它的2个中位数中较大的一个)作为划

分基准,将全部的数划分为两个部分,小于基准的在左边,大于等于基准的放右边。在这种情况下,找出的基准x至少比3(n-5)/10个元素大,因为在每一组中有2个元素小于本组的中位数,中位数处于1/2*[n/5-1],即n/5 个中位数中又有(n-5)/10个小于基准x。同理,基准x也至少比3(n-5)/10个元素小。而当n≥75时,3(n-5)/10≥n/4所以按此基准划分所得的2个子数组的长度都至少缩短1/4。

思路:如果能在线性时间内找到一个划分基准,使得按这个基准所划分出的2个子数组的长度都至少为原数组长度的ε倍(0<ε<1是某个正常数),那么就可以在最坏情况下用O(n)时间完成选择任务。

例如:若ε=9/10,算法递归调用所产生的子数组的长度至少缩短1/10。所以,在最坏情况下,算法所需的

计算时间T(n)满足递归式T(n)≤T(9n/10)+O(n) 。由此可得T(n)=O(n)。

方法:利用函数的相互调用和函数的递归调用实现程序的最终实现,一个主函数,三个子函数。在主函数中只是单独的调用中位数算法的select函数,然后以select为入口进行调用bubble排序函数和partition划分函数。

【源程序代码】

#include

#include

#include

using namespace std;

#define MAX_VALUE 100

#define random() rand()%MAX_VALUE #define N 10

#define MIDDLE 5

int a[N];

class Find

{

public:

//冒泡排序

void bubble(int first,int end)

{

for(int i = first; i < end; i++)

for(int j = end; j > i; j--)

if(a[j]

{

swap(a[j], a[j - 1]);

}}

//数组a中从a[p]到a[r]的元素按照x划分,大于x的在左边,小于x的在右边int partition(int p,int r,int x)

{

int i = p - 1, j = r + 1;

while (1)

{

while (a[++i] < x && i < r);

while (a[--j] > x);

if (i >= j)

break;

swap(a[i], a[j]);

}

return j - 1;

}

//寻找中位数

int select(int p,int r,int k)

{

if(r - p < 75)

{

bubble(p,r);

return a[p+k-1];

}

for(int i = 0; i < (r - p - 4) / 5; i++)

{

int s = p + 5 * i, t = s + 4;

bubble(s,t);

int temp = a[p + i];

a[p + i] = a[s + 2];

a[s + 2] = temp;

}

// 找中位数的中位数

int x = select(p, p + (r - p - 4) / 5, (r - p - 4) / 10);

i = partition(p, r, x);

int j = i - p + 1;

if(k <= j)

return select(p, i, k);

else

return select(i + 1, r, k - j);

}

};

int main()

{

srand((int)time(NULL));

for(int k = 0; k < N; k++)

{

a[k] = random();

cout << a[k] << "\t";

}

cout << endl;

Find f;

int n = MIDDLE;

cout << "The No."<< n << " is :" << f.select(0, N-1, n) << endl;

return 0;

}

【实验结果】

运行结果图(k=5):

运行结果图(k=4):

实验结果分析:通过上面的结果图可以证明程序可以得到正确的排序结果。

实验二 选择结构程序设计 实验报告,DOC

实验二选择结构程序设计 一、实验目的和要求 1.掌握关系表达式和逻辑表达式的使用。 2.熟悉选择结构程序设计。 3.熟练使用if语句进行程序设计。 4.使用switch语句实现多分支选择结构。 二、实验设备 PC机VisualC++6.0 三、实验内容 (一)实验准备 1.从程序流程的角度来看,程序可以分为三种基本结构,即顺序结构、分支(选择)结构、循环结构。 2.If-else语句: 一般形式为:if(表达式) 语句1; else 语句2; 该语句用于实现分支结构,根据表达式的值选择语句1或语句2中的一条执行。首先求解表达式,如果表达式的值为“真”,则执行语句1;如果表达式的值为“假”,则执行语句2. 2.switch语句 switch语句可以处理多分支选择问题,根据其中break语句的使用方法,

一般分为三种情况。 (二)实验项目 1.计算a+|b| #include intmain(void) { inta,b,z; printf("Pleaseentera,b:\n"); scanf("%d,%d",&a,&b); if(b>=0){ b=b; } else{ b=-b; } z=a+b; printf("%d+%d=%d\n",a,b,z); return0; } 2判断一个整数是否可以被3和5整除 #include intmain(void) { inta; printf("Pleaseentera:\n"); scanf("%d",&a); if(a%3==0){ printf("a可以被3整除:\n"); } else{ if(a%5==0){ printf("a可以被5整除:\n"); } else{ printf("a不可以被5整除,也不可以被3整除:\n"); } }

随机化算法实验(Sherwood型线性时间选择)

算法分析与设计实验报告 第八次实验 所需的平均时间为 的可能性。希望获得一个随机化算法 的每一个实例均有。

不输出数组数只输出结果比较:

附录: 完整代码(随机化算法) Sherwood.cpp //随机化算法线性时间选择输入预处理洗牌 #include"RandomNumber.h" #include #include #include using namespace std; template Type select(Type a[],int l,int r,int k); //声明选出要选择的元素的函数

template //声明判断是否越界的函数 Type select(Type a[],int n,int k); template //声明洗牌算法函数Shuffle void Shuffle(Type a[],int n); template //声明交换函数 inline void Swap(Type &a,Type &b); void ran(int *input,int n) //随机生成数组元素函数{ int i; srand(time(0)); for(i=0;i>n; int *a=new int[n+1]; cout<<"原数组为:"<

线性时间选择算法

福州大学数学与计算机科学学院 《计算机算法设计与分析》上机实验报告(1)

图中箭头指向表示大的数值指向小的数值,所以根据图 可以看出,在x的右边,每一个包含5个元素的组中至少有3 个元素大于x,在x的左边,每一组中至少有3个元素小于x (保证x分割一边必定有元素存在)。 图中显示的中位数的中位数x的位置,每次选取x作为划 分的好处是能够保证必定有一部分在x的一边。所以算法最坏 情况的递归公式可以写成: ,使用替换法可以得出) (。 n cn T 4、算法代码: #include #include using namespace std; template void Swap(Type &x,Type &y); inline int Random(int x, int y); template int Partition(Type a[],int p,int r); template int RandomizedPartition(Type a[],int p,int r); template Type RandomizedSelect(Type a[],int p,int r,int k); int main() { void SelectionSort(int a[]); int s;

int a[2000]; int b[2000]; for(int i=0; i<2000; i++) { a[i]=b[i]=rand()%10000; cout< void Swap(Type &x,Type &y) { Type temp = x; x = y; y = temp; } inline int Random(int x, int y) { srand((unsigned)time(0)); int ran_num = rand() % (y - x) + x; return ran_num; } template int Partition(Type a[],int p,int r) { int i = p,j = r + 1; Type x = a[p]; while(true) { while(a[++i]x); if(i>=j) { break;

舍伍德线性时间选择

算法分析与设计实验报告 第8次实验

附录:完整代码 #include using namespace std; //随机数类 const unsigned long maxshort=66536L; const unsigned long multiplier=1194211693L;

const unsigned long adder=12345L; class RandomNumber{ private: //当前种子 unsigned long randSeed; public: RandomNumber (unsigned long s=0); //构造函数,默认值0表示由系统自动产生种子 unsigned short Random(unsigned long n); //产生0:n-1之间的随机整数 double fRandom(void); //产生[0,1)之间的随机实数 }; RandomNumber::RandomNumber(unsigned long s){ if(s==0) randSeed=time(0); else randSeed=s; } unsigned short RandomNumber::Random(unsigned long n){ randSeed=multiplier*randSeed+adder; return(unsigned short)((randSeed>16)%n); } double RandomNumber::fRandom(void){ return Random(maxshort)/double(maxshort); } template inline void Swap(Type &a,Type &b) { Type temp = a; a = b; b = temp; } //计算a[l:r]中第k小元素 template Type select(Type a[],int l,int r,int k) { static RandomNumber rnd; while(true) { if(l>=r) { return a[l]; } int i = l, j = l + rnd.Random(r-l+1);//随机选择划分基准 Swap(a[i],a[j]);

线性时间排序

8.1比较排序算法的时间下界 决策树模型 比较排序的过程可以被抽象地视为决策树。一棵决策树是一棵满二叉树,表示某排序算法作用于给定输入所做的所有比较。排序算法的执行对应于遍历一条从树的根到叶节点的路径。每个内结点对应一个比较ai&aj,左子树决定着ai<=aj以后的比较,右子树决定着ai>aj以后的比较。当到达一个叶节点时,排序算法就已确定。排序算法能够正确工作的的必要条件是,n个元素的n!种排列都要作为决策树的一个叶节点出现。设决策树的高度为h,叶子数目为l,那么有2h>=l>=n!,于是有h>lgn! = Ω(nlgn)。这说明比较排序的最坏时间复杂度为Ω(nlgn)。这也说明合并排序和堆排序的复杂度已经渐进最优了。 练习: 8.1-1 在比较排序的决策树中,一个叶节点最小可能的深度是多少? 分析:n-1。因为至少要比较n-1次。不知道有没有更加理论化的证明? 8.1-3 证明:对于长度为n的n!种输入中的至少一半而言,不存在具有线性时间的比较排序算法。对n!的1/n部分而言又怎样?1/2n部分呢? 分析:假设在决策树种,m个叶节点的深度为h =O(n);那么有2h > m,于是可知h为 Ω(lgm)。将m=n!/2代入,可知这与h=O(n)相矛盾。同样,对于1/n*n!和1/2n*n!也一样。 8.1-4 现有n个元素要排序,输入序列为n/k个子序列,每个包含k个元素,每个子序列中的元素都小于后继子序列中的元素,大于前驱子序列中的元素。这样只要对个子序列中的k 各元素进行排序就可以得到对整个输入序列的排序结果,证明:这个排序问题中所需的比较

次数有一个下界Ω(nlgk)。 分析:每个k元素子序列的排列数目为k!,那么整个序列在上述条件下的排列数目为(k!)n/k。按决策树的分析方法,决策树的深度为h>lg((k!)n/k) = n/k lg (k!)>n/k lg (k/2)k/2= n/2lgk/2。因此h=Ω(nlgk)。 8.2计数排序 计数排序假设n个输入元素的每一个都是介于0到k之间的整数,此处k为某个整数。当 k=O(n)时,计数排序的运行时间为Θ(n)。 计数排序的思想就是对每一个输入元素x,确定出小于x的元素个数。有了这一信息,就可以把x直接放到最终输出数组的为位置上了。 下面是计数排序的伪码,假定输入是数组A[1...n], 存放排序结果的B[1...n],以及提供计数临时存储的C[0...k]。 COUNTING-SORT(A,B,k) 1 for i <-- 0 to k 2 do C[i] <-- 0 3 for j <-- 1 to length[A] 4 do C[A[j]] <-- C[A[j]]+1 5 for i <-- 1 to k

时间序列分析——最经典的

【时间简“识”】 说明:本文摘自于经管之家(原人大经济论坛) 作者:胖胖小龟宝。原版请到经管之家(原人大经济论坛) 查看。 1.带你看看时间序列的简史 现在前面的话—— 时间序列作为一门统计学,经济学相结合的学科,在我们论坛,特别是五区计量经济学中是热门讨论话题。本月楼主推出新的系列专题——时间简“识”,旨在对时间序列方面进行知识扫盲(扫盲,仅仅扫盲而已……),同时也想借此吸引一些专业人士能够协助讨论和帮助大家解疑答惑。 在统计学的必修课里,时间序列估计是遭吐槽的重点科目了,其理论性强,虽然应用领域十分广泛,但往往在实际操作中会遇到很多“令人发指”的问题。所以本帖就从基础开始,为大家絮叨絮叨那些关于“时间”的故事! Long long ago,有多long估计大概7000年前吧,古埃及人把尼罗河涨落的情况逐天记录下来,这一记录也就被我们称作所谓的时间序列。记录这个河流涨落有什么意义当时的人们并不是随手一记,而是对这个时间序列进行了长期的观察。结果,他们发现尼罗河的涨落非常有规律。掌握了尼罗河泛滥的规律,这帮助了古埃及对农耕和居所有了规划,使农业迅速发展,从而创建了埃及灿烂的史前文明。

好~~从上面那个故事我们看到了 1、时间序列的定义——按照时间的顺序把随机事件变化发展的过程记录下来就构成了一个时间序列。 2、时间序列分析的定义——对时间序列进行观察、研究,找寻它变化发展的规律,预测它将来的走势就是时间序列分析。 既然有了序列,那怎么拿来分析呢 时间序列分析方法分为描述性时序分析和统计时序分析。 1、描述性时序分析——通过直观的数据比较或绘图观测,寻找序列中蕴含的发展规律,这种分析方法就称为描述性时序分析 描述性时序分析方法具有操作简单、直观有效的特点,它通常是人们进行统计时序分析的第一步。 2、统计时序分析 (1)频域分析方法 原理:假设任何一种无趋势的时间序列都可以分解成若干不同频率的周期波动 发展过程: 1)早期的频域分析方法借助富里埃分析从频率的角度揭示时间序列的规律 2)后来借助了傅里叶变换,用正弦、余弦项之和来逼近某个函数 3)20世纪60年代,引入最大熵谱估计理论,进入现代谱分析阶段 特点:非常有用的动态数据分析方法,但是由于分析方法复杂,结果抽象,有一定的使用局限性 (2)时域分析方法

复杂度-线性时间选择算法复杂度分析

算法分析线性时间选择复杂度分析 第二组:袁瑾(计科1304:201308010410), 欧阳玉峰(计科1304:201308080216), 程帆瑾(物联1302:201378010206)。 一、问题描述: 给一个线性序列,要求在一个平均时间线性的情况下进行第k小元素的选择。 二、方法一: 模仿快速排序的方法对输入序列进行递归划分,但只对划分出的子数组之一进行递归处理。 代码如下: RandomizedSelect(a, p, r, k): if p==r : return a[p] i = RandomizedPartition(a,p,r) j = i-p+1 if k<=j : return RandomizedSelect(a,p,i,k) return RandomizedSelect(a,i+1,r,k-j) 三、方法一时间复杂度: 先从上边的函数说起。其实质是模拟一个快速排序的过程。快速排序是随机选择一个轴值,然后比轴值小的排在左边,比轴值大的排在右边。上边的函数四个参数a,p,r,k。a是数组的参数,p是数组开始元素的下标,r的数组结束的下标。k是找第k小的元素。每次划分所需要的时间是O(n),此时每个元素需要和轴值进行比较一次。所以最好的情况是选完轴值一次快排后,左边刚好有k-1个元素,则此时轴值则是第k小元素。而一般情况是,轴值左边有m个元素,mk时,在左边找第k小的元素。平均复杂度是O(n)。最坏的情况是轴值每次选的都是刚好最大的元素或者最小的元素,此时时间复杂度是O(n*k)。四.方法二: 能在线性时间内找到一个划分基准,使得按照这个基准所划分出的两个子数组长度都至少为元数组长度的 m 倍: Select(a, p, r, k): if r-p

算法设计与分析线性时间选择讲解文档

《线性时间选择》讲解文档 问题: 给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素 基本思想: template Type RandomizedSelect(Type a[],int p,int r,int k) { if (p==r) return a[p]; int i=RandomizedPartition(a,p,r), j=i-p+1; if (k<=j) return RandomizedSelect(a,p,i,k); else return RandomizedSelect(a,i+1,r,k-j); } 分析: 在最坏情况下,算法randomizedSelect需要O(n2)计算时间 但可以证明,算法randomizedSelect可以在O(n)平均时间内找出n个输入元素中的第k小元素。 改进算法:【中位数】 如果能在线性时间内找到一个划分基准,使得按这个基准所划分出的2个子数组的长度都至少为原数组长度的ε倍(0<ε<1是某个正常数),那么就可以在最坏情况下用O(n)时间完成选择任务。 例如,若ε=9/10,算法递归调用所产生的子数组的长度至少缩短1/10。在最坏情况下,算法所需的计算时间T(n)满足递归式T(n)≤T(9n/10)+O(n) 。由此可得T(n)=O(n)。 具体步骤: 将n个输入元素划分成 n/5 个组,每组5个元素,只可能有一个组不是5个元素。用任意一种排序算法,将每组中的元素排好序,并取出每组的中位数,共 n/5 个。 递归调用select来找出这 n/5 个元素的中位数。如果 n/5 是偶数,就找它的2个中位数中较大的一个。以这个元素作为划分基准 设所有元素互不相同。在这种情况下,找出的基准x至少比3(n-5)/10个元素大,因为在每一组中有2个元素小于本组的中位数,而n/5个中位数中又有(n-5)/10个小于基准x。同理,基准x也至少比3(n-5)/10个元素小。而当n≥75时,3(n-5)/10≥n/4所以按此基准划分所得的2个子数组的长度都至少缩短1/4。

多元线性回归模型实验报告

多元线性回归模型实验报告 13级财务管理 101012013101 蔡珊珊 【摘要】首先做出多元回归模型,对于解释变量作出logx等变换,选择拟合程度最高的模型,然后判断出解释变量之间存在相关性,然后从检验多重线性性入手,由于解释变量之间有的存在严重的线性性,因此采用逐步回归法,将解释变量进行筛选,保留对模型解释能力较强的解释变量,进而得出一个初步的回归模型,最后对模型进行异方差和自相关检验。 【操作步骤】1.输入解释变量与被解释变量的数据 2.作出回归模型

R^2=0.966951 DW=0.626584 F-statictis=241.3763 ②我们令y1=log(consumption),x4=log(people),x5=log(price),x6=log(retained),x7= log(gdp), 作出回归模型

② 发现拟合程度很高,也通过了F检验与T检验。但是我们首先检查模型的共线性 发现x4与x6,x4与x7,x6与x7存在很强的共线性,对模型会造成严重影响。

目前暂用模型y1=10.55028-3.038439x4-0.236518x5+2.647396x6-0.557805x7,我们将陆续进行调整。 3.分别作出各解释变量与被解释变量之间的线性模型

①作出汽车消费量与汽车保有量之间的线性回归模型 R^2=0.956231 DW=0.147867 F-statistic=786.4967

因为prob小于α置信度,则可说明β1不明显为零。经济意义存在 Y1^=4.142917 + 0.761197x6 (8.283960) (28.04455)

线性时间选择中位数

湖南涉外经济学院计算机科学与技术专业《算法设计与分析》课程 线性时间选择(中位数) 实验报告 班级: 学号: 姓名: 教师: 成绩:

2012年5月

【实验目的】 1 掌握线性时间选择的基本算法及其应用 2 利用线性时间选择算法找出数组的第k小的数 3 分析实验结果,总结算法的时间和空间复杂度 【系统环境】 Windows7 旗舰版平台 【实验工具】 VC++6.0英文企业版 【问题描述】 描述:随机生成一个长度为n的数组。数组为随机生成,k由用户输入。在随机生成的自然数数组元素找出这n个数的第k小的元素。 例:A[5]={3,20,50,10,21} k=3,则在数组A中第3小的元素为20 【实验原理】 原理:将所有的数(n个),以每5个划分为一组,共[n/5]组(将不足五个的那组忽略);然后用任意一种排序算法(因为只对五个数进行排序,所以任取一种排序法就可以了,这里我选用冒泡排序),将每组中的元素排好序再分别取每组的中位数,得到[n/5]个中位数;再取这[n/5]个中位数的中位数(如果n/5是偶数,就找它的2个中位数中较大的一个)作为划

分基准,将全部的数划分为两个部分,小于基准的在左边,大于等于基准的放右边。在这种情况下,找出的基准x至少比3(n-5)/10个元素大,因为在每一组中有2个元素小于本组的中位数,中位数处于1/2*[n/5-1],即n/5 个中位数中又有(n-5)/10个小于基准x。同理,基准x也至少比3(n-5)/10个元素小。而当n≥75时,3(n-5)/10≥n/4所以按此基准划分所得的2个子数组的长度都至少缩短1/4。 思路:如果能在线性时间内找到一个划分基准,使得按这个基准所划分出的2个子数组的长度都至少为原数组长度的ε倍(0<ε<1是某个正常数),那么就可以在最坏情况下用O(n)时间完成选择任务。 例如:若ε=9/10,算法递归调用所产生的子数组的长度至少缩短1/10。所以,在最坏情况下,算法所需的 计算时间T(n)满足递归式T(n)≤T(9n/10)+O(n) 。由此可得T(n)=O(n)。 方法:利用函数的相互调用和函数的递归调用实现程序的最终实现,一个主函数,三个子函数。在主函数中只是单独的调用中位数算法的select函数,然后以select为入口进行调用bubble排序函数和partition划分函数。 【源程序代码】 #include #include #include

实验报告1

物电学院09级电子(2)学号 200940620219 姓名 刘杰 阜阳师范学院 大学物理实验报告 【实验名称】:数字电表原理与万用表设计使用 【实验目的】:1、了解数字电表的基本原理及常用双积分模数转换芯片外围参数的选 取原则、电表的校准原则以及测量误差的来源。 2、了解万用表的特性、组成和工作原理。 3、掌握分压、分流电路的原理以及设计对电压、电流和电阻的多量程测量。 4、了解交流电压、三极管和二极管相关参数的测量。 5、通过数字电表原理的学习,能够在传感器设计中灵活应用数字电表。 【实验仪器】:1、309FB 型数字电表原理及万用表设计实验仪; 2、四位半通用数字万用表; 3、双踪示波器。 【实验原理】:一、数字电表原理: 常见的物理量都是幅值大小连续变化的所谓模拟量,指针式仪表可以直接对模拟电压和电流进行显示。而对于数字式仪表,则需要先把模拟电信号(通常是电压信号)转换成数字信号,再进行显示和处理。 数字信号与模拟信号不同,其幅值大小不是连续的,就是说数字信号的大小只能是某些分立的数值,所以需要进行量化处理。若最小量化单位为?,则数字信号的大小是?的整数倍,该整数可以用二进制码表示。设mV 1.0=?,我们把被测电压U 和?比较,看U 是?的多少倍,并把结果四舍五入取为整数N (二进制)。一般情况下,1000≥N 即可满足测量精度要求(量化误差%1.01000/1=≤)。所以,最常见的数字表头的最大示数为1999 ,被称为三位半(2 13)数字表。如U 是?(mV 1.0)的1861倍,即1861=N ,显示结果为mV)( 1.186。这样的数字表头,再加上电压极性判别显示电路和小数点选择位,就可以测量显示mV 9.199~9.199- 的电压,显示精度为mV 1.0 。 1、双积分模数转换器(7107ICL )的基本工作原理: 双积分模数转换电路的原理比较简单,当输入电压为X V 时,在一定时间1T 内对电量为零的电容器C 进行恒流充电(电流大小与待测电压X V 成正比),这样电容器两极板之间的电量将随时间线性增加,当充电时间到1T 后,电容器上积累的电量Q 与被测电压X V 成正比;

线性时间选择算法实现

【题目】:给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素,(这里给定的线性集是无序的)【思路】:如果能在线性时间内找到一个划分基准,使得按这个基准所划分出的2个子数组的长度都至少为原数组长度的ε倍(0<ε<1是某个正常数),那么就可以在最坏情况下用O(n)时间完成选择任务。例如:若ε=9/10,算法递归调用所产生的子数组的长度至少缩短1/10。所以,在最坏情况下,算法所需的计算时间T(n)满足递归式 T(n)≤T(9n/10)+O(n) 。由此可得T(n)=O(n)。 #include #include #include #include int select(int *a,int p,int r,int k); int partition(int *a,int p,int r,int x); void sort(int *a,int p,int r); void swap(int *a,int *b); //主函数 int main() { int *a,cnt,i,k,result; FILE *fp; //clrscr(); printf("Input the count of elements:"); scanf("%d",&cnt); printf("Choose the element :"); scanf("%d",&k); a=(int *)malloc(cnt*sizeof(int)); srand(time(NULL)); if((fp=fopen("d:\\output.txt","w+"))==NULL) { printf("Cannot open this file!"); exit(0); } for(i=0;i

算法实验报告

《算法设计与分析》上机实验报告

一、分治与递归 1、问题描述 编写程序,实现线性时间内选择n个元素的中位数的算法。并对于不同的n,测试平均时间效率。 2、问题分析 本问题属于线性选择问题的一个特例,可以使用分治法进行求解。其基本思想是模仿快速排序方法,对输入的数组进行划分,求出中位数所在的子数组,然后用递归的方法进行求解,最终可以求得问题的解。 3、算法设计 将n个输入元素根据随机选择的基准划分成2个子数组,a[p:r]被划分成a[p:i]和a[i+1:r]两组,使得a[p:i]中每个元素都不大于a[i+1:r]中元素。接着算法计算子数组a[p:i]中元素个数j,如果k<=j,则a[p:r]中第k个小元素落在子数组a[p:i]中元素均小于要找的第k小元素,因此要找的a[p:r]中第k小元素是a[i+1:r]中的第k-j小元素。 按照上述的方法递归的执行,直到当前数组中只剩下一个元素,就可以得到问题的解。 4、算法实现 #include"iostream.h" #include"stdlib.h" #include"time.h" #include #include #include"windows.h" #include int randomizedSel(int *,int ,int ,int );

void main() { srand((unsigned int)time(NULL)); _timeb time0,time1; int n; cout << "请输入数组的长度:"; cin >> n; cout << "请输入数组的每一个数:" << endl; int *a=new int[n]; for(int i=0;i> a[i]; DWORD stime=GetTickCount(); _ftime(&time0); int result=randomizedSel(a,0,n-1,(n+1)/2); DWORD Etime=GetTickCount(); _ftime(&time1); cout << "结果为:" << result << endl; cout << https://www.doczj.com/doc/292613489.html,litm*https://www.doczj.com/doc/292613489.html,litm*1000<x); if(i>=j) break; swap(a,i,j); } a[p]=a[j]; a[j]=x; return j;

线性回归算法

线性回归 1. 代价函数最小化的方法: ● (批量)梯度下降法 ● 正归方程 2. 梯度下降法 先假设一个定点,然后按照一定的步长顺着这个点的梯度进行更新迭代下去,最后可以找到一个局部最优点,使代价函数在这个局部取得最小值 量(vector) 测 价

度 注: 1.是对θi的求偏导 2.批量梯度下降的每一步都用到了所有的训练样本 3.在多维问题中,要保证这些特征值都具有相近的维度,使得梯度下降 算法更快的收敛. 特征缩放公式: 1.除以最大值 2. 3.学习率的选择: 可以绘制迭代次数和代价函数的图表来观测算法在何时趋于收敛通常可以考虑尝试些学习率:α=0.01,0.03,0.1,0.3,1,3,10 规可以一次性求出最优解 ①定义训练的参数(学习率训练次数打印步长) ②输入训练集(定义占位符X = tf.placeholder("float")Y = tf.placeholder("float")) ③随机生成w与b(初始化的方式很多种,方式不同可能会影响训练效果) ④创建线性模型(pred = tf.add(tf.multiply(X, W), b))

⑤用均方差计算training cost(cost = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*n_samples)) ⑥使用梯度下降进行优化(optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)) ⑦变量初始化与创建图 init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) ⑧开始训练 Fit所有的训练数据 设定每50次的打印内容 ⑨用测试集进行测试 计算testing cost 计算training cost 与testing cost之间的差值并输出 ⑩画图 程序: import tensorflow as tf import numpy import matplotlib.pyplot as plt rng = numpy.random #产生随机数 # Parameters(参数学习率训练次数打印步长) learning_rate = 0.01 training_epochs = 1000 display_step = 50 # Training Data train_X = numpy.asarray([3.3,4.4,5.5,6.71,6.93,4.168,9.779,6.182,7.59,2.167, 7.042,10.791,5.313,7.997,5.654,9.27,3.1]) train_Y= numpy.asarray([1.7,2.76,2.09,3.19,1.694,1.573,3.366,2.596,2.53,1.221, 2.827, 3.465,1.65,2.904,2.42,2.94,1.3]) n_samples = train_X.shape[0] # tf Graph Input X = tf.placeholder("float") Y = tf.placeholder("float")

线性度实验报告

线性度实验报告 篇一:传感器实验报告 传感器实验报告(二) 自动化1204班蔡华轩 UXX13712 吴昊 UXX14545 实验七: 一、实验目的:了解电容式传感器结构及其特点。 二、基本原理:利用平板电容C=εA/d 和其它结构的关系式通过相应的结构和测量电路可以选择ε、A、d 中三个参数中,保持二个参数不变,而只改变其中一个参数,则可以有测谷物干燥度(ε变)测微小位移(变d)和测量液位(变 A)等多种电容传感器。 三、需用器件与单元:电容传感器、电容传感器实验模板、测微头、相敏检波、滤波模板、数显单元、直流稳压源。 四、实验步骤: 1、按图6-4 安装示意图将电容传感器装于电容传感器实验模板上。 2、将电容传感器连线插入电容传感器实验模板,实验线路见图7-1。图 7-1 电容传感器位移实验接线图 3、将电容传感器实验模板的输出端V01 与数显表单元Vi 相接(插入主控箱Vi 孔),Rw 调节到中间位置。 4、接入±15V 电源,旋动测微头推进电容传感器动极

板位置,每间隔0.2mm 图(7-1) 五、思考题: 试设计利用ε的变化测谷物湿度的传感器原理及结构,并叙述一下在此设计中应考虑哪些因素? 答:原理:通过湿度对介电常数的影响从而影响电容的大小通过电压表现出来,建立起电压变化与湿度的关系从而起到湿度传感器的作用;结构:与电容传感器的结构答大体相同不同之处在于电容面板的面积应适当增大使测量灵敏度更好;设计时应考虑的因素还应包括测量误差,温度对测量的影响等 六:实验数据处理 由excle处理后得图线可知:系统灵敏度S=58.179 非线性误差δf=21.053/353=6.1% 实验八直流激励时霍尔式传感器位移特性实验 一、实验目的:了解霍尔式传感器原理与应用。 二、基本原理:霍尔式传感器是一种磁敏传感器,基于霍尔效应原理工作。 它将被测量的磁场变化(或以磁场为媒体)转换成电动势输出。 根据霍尔效应,霍尔电势UH=KHIB,当霍尔元件处在梯度磁场中

信号与系统 线性时不变系统实验报告

信号与系统实验报告 实验名称:线性时不变系统 姓名: 学号: 班级: 时间:

一、 实验目的 1、 掌握线性时不变系统的特性; 2、 学会验证线性时不变系统的性质。 二、实验基本原理 线性时不变系统具有如下的一些基本特性。 1.线性特性(包含叠加性与均匀性) 对于给定的系统,11()()x t t 、y 和22()()x t t 、y 分别代表两对激励与响应。 对于叠加性:当11()()x t y t ??→,22()()x t y t ??→ 则1212()()()()x t x t y t y t +??→+ 图2.1 对于均匀性: 当()()x t y t ??→, 则()()kx t ky t ??→,0k ≠ 图2.2 综合以上,则当激励是1122()()k x t k x t ?+?时,则对应的响应为 1122()()k y t k y t ?+?。对于线性时不变系统,如果起始状态为零,则系统满足叠加 性与均匀性(线性性)。 2.时不变特性 对于时不变系统, 当11()()x t t ??→y , 则1010()()x t t t t -??→-y

图2.3 3. 微分特性 对于线性时不变系统,当()()x t t ??→y 则 ()() dx t dy t dt dt ??→ 图2.4 4. 因果性 因果系统是指系统在时刻0t 的响应只与0t t =和0t t <时刻的输入有关。 也就是说,激励是产生响应的原因,响应是激励引起的后果,这种特性称为因果性。通常由电阻器、电感线圈、电容器构成的实际物理系统都是因果系统。 二、 实验内容及结果 记录实验过程中的输入输出波形。 1、线性特性 1).叠加性观察 (1) 设置信号产生模块为模式3(11) ; (2) 用按键1使对应的“信号A 组”的输出1-x 2信号(信号A 组的信号输出指示灯为001011):记录波形为x1(t )

信号与线性系统实验报告5

连续信号与系统的复频域分析及MATLAB实现 一、实验目的 1、掌握MATLAB 实现连续时间信号拉普拉斯变换及逆变换的方法。 2、掌握MATLAB 绘制拉普拉斯变换的三维曲面图,并分析复频域特性和时 移特性。 二、实验原理及知识要点 1、连续时间非周期信号的拉普拉斯变换及逆变换(laplace( )及ilaplace( )函数); 2、拉普拉斯变换的数值算法; 3、绘制拉普拉斯变换的三维曲面图(meshgrid()及mesh()函数) 三、实验软件: MATLAB软件 四、实验内容及实验记录 12.1 利用MATLAB的laplace函数,求下列信号的拉普拉斯变换。 (1) syms t; F=(1-exp(-0.5*t))*Heaviside(t); L=laplace(F) 运行的结果为: L = 1/s-1/(s+1/2) 12.2 利用MATLAB的ilaplace函数,求下列像函数F(s)的拉普拉斯逆变换。 (1)syms s; L=(s+1)/(s*(s+2)*(s+3)); F=ilaplace(L) 运行的结果: F = 1/6+1/2*exp(-2*t)-2/3*exp(-3*t) 12.3 利用MATLAB的residue函数求12.2题中(1)小题的拉普拉斯逆变换,并与ilaplace 函数的计算结果进行比较。 (1)a=[1 1]; b=[1 5 6 0]; [k,p,c]=residue(a,b) 运行的结果为: k = -0.6667 0.5000 0.1667 p =

-3.0000 -2.0000 0 c = [] 由上述程序的运行结果知,F(s)有三个单实极点, 部分分式展开结果: F(s)=(-2/3)/(s+3)+0.5/(s+2)+(1/6)/s 则拉普拉斯逆变换: f(t)=(-2/3e^(-3t)+0.5e^(-2t)+1/6)u(t) 用residue 函数求出的结果与用ilaplace 函数求出的结果是一样的。只是后者简单点。 12.4 试用MATLAB 绘出下列信号拉普拉斯变换的三维曲面图,并通过三维曲面图观察分析信号的幅频特性。 (4) f(t)=exp(-t)*cos(pi*t/2)*u(t) 其对应的拉氏变换为: (1) syms t; F=exp(-t)*cos(pi/2*t); L=laplace(F) L = (s + 1)/((s + 1)^2 + pi^2/4) 曲面图及代码为: x=-1:0.08:0.2; y=-2:0.08:2; [x,y]=meshgrid(x,y); s=x+i*y; F=abs(4./pi.^2.*(s+1)./(4.*(s+1).^2./pi.^2+1)); mesh(x,y,F); surf(x,y,F) colormap(hsv); title('单边指数信号拉普拉斯变换幅度曲面图'); xlabel('实轴') ylabel('虚轴') -1 -0.50 0.5 -2 -1 1 2 51015 20实轴 单边指数信号拉普拉斯变换幅度曲面图虚轴

算法实验报告——线性时间选择问题

实验五线性时间选择问题 年级16 学号飞宇成绩 专业信息安全实验地点C1-413 指导教师丽萍实验日期 一、实验目的 1、理解分治法的基本思想 2、掌握分治法解决问题的基本步骤,并能进行分治算法时间空间复杂度分析。 二、实验容 线性时间选择问题:给定线性序集中n个元素和一个整数k(k>=1而且k<=n),要求在线性时间找出这n个元素中第k小的元素。 1.随机快速排序 2.利用中位数线性时间选择 三、算法描述 1.随机快速排序 在算法Randomized_Select中执行Randomized_Partition,将数组分成两个子数组,在Randomized_Partition中调用Partition函数确定一个基准元素,对数组进行划分。由于划分是随机产生的,由此导致算法Randomized_Select也是一个随机化算法。 2.利用中位数线性时间选择 四、程序 1.随机快速排序 #include #include #include int Randomized_Select(int a[],int p,int r,int i); int Randomized_Partition(int a[],int p,int r); int Partition(int a[],int p,int r); void swap(int *a,int *b); int Random(int p,int q); int main() { int a[] = {10,9,8,7,6,5,4,3,2,1}; int i = 3;

printf("第%d小的数是:\n%d",i,Randomized_Select(a,0,9,i)); return 0; } void swap(int *a,int *b) { int temp; temp = *a; *a = *b; *b = temp; } int Random(int p,int q)//产生p和q之间的一个随机整数 { int i,number; srand((unsigned)time(NULL)); number = rand()%(q-p+1)+p; return number; } int Partition(int a[],int p,int r)//快排的部分 { int x = a[r]; int i = p- 1; int j; for(j = p;j<=r-1;j++) { if(a[j] <= x) { i = i + 1; swap(&a[j],&a[i]); } } swap(&a[i+1],&a[r]); return i+1; } int Randomized_Partition(int a[],int p,int r)//随机交换数字 { int i = Random(p,r);

相关主题
文本预览
相关文档 最新文档