改成这样试试
<html>
<head><title>老会员登录</title>
<style>
<!--td{font:10pt;} -->
</style>
</head>
<body style="font:10pt">
<%
dim flag
logname=trim(requestform("logname"))
password=trim(requestform("password"))
if isnull(logname) then
responsewrite "<center><h1>错误 *** 作!请重试。。。。</center></h1>"
responseend
end if
flag=0
found=false
logexist=1
connstring="Provider=MicrosoftJetOLEDB40;Data Source="&ServerMapPath(db)
set conn=servercreateobject("adodbconnection")
connopen connstring
set objusersrs=connexecute("select from users")
if not objusersrseof then
responsewrite "<fong style=""font:10pt"">对不起,数据库中没有这个用户。是否<a href=""enrollasp"">重新注册</a>"
responseend
end if
objusersrsmovefirst
do until objusersrseof
if ((logname=objusersrs("userid") and (password=objusersrs("userpw")) then
responsewrite "<font style=""font:10pt"">登录成功<a href=""showasp"" style=""color:blue"">开始报名</a></font><br><br>"
custid=objusersrs("custid")
points=objusersrs("points")
' responsewrite custid
found =true
session("login")=sessionsessionid
session("loginuser")=objusersrs("userid")
' responsewrite "找到你了"
exit do ' 找到用户,推出循环
else
if logname=objusersrs("userid") then
logexit=0
exit do
end if
end if
objusersrsmovenext
loop
if logexist=0 then
session("logname")=logname
responsewrite "<center>对不起,你的密码输入错误,请<a href=""oldloginasp"">重试</a></center>"
responseend
end if
if found=false then
session("logname")=logname
responsewrite "<center>对不起,数据库中没有这个用户的资料。<br>是否<a href=""enrollasp"">现在注册</a></center>"
flag=1
end if
' responsewrite "debug"
if not objordersrseof then
objordersrsmovefirst
end if
connclose
set conn=nothing
%>
</body>
</html>
排序算法第一篇-排序算法介绍
在面试中,现在无论大小公司都会有算法的。其中排序算法也是一种很常见的面试题。比如冒泡,快排等。这些,排序算法自己看了一次又一次,可是过一段时间,又忘掉了。所以,这次就把算法是怎么推导出来的,详细记录下来。看看这次多久还会忘记。
本文主要介绍排序算法的分类、时间复杂度、空间复杂。为了后面的学习做准备的。
通过本文学习,将收获到:排序算法分几类?什么是算法的时间复杂度?是怎么算出来的?什么是算法的空间复杂度?常见的时间复杂度比较。
如果这些您都已经知道了,可以不用耽误时间看了。
约定:
文中的n2表示的是n的2次方(n²),n^2也是表示n的2次方;
n3表示的是n的3次方;
n^k表示的是n的k次方;
long2n表示的是以2为底的对数。
本文出自:凯哥Java(微信:kaigejava)学习Java版数据结构与算法笔记。
一:介绍
排序又称排序算法(Sort Algorithm),排序是将一组数据,依据指定的顺序进行排序的过程。
二:分类
排序的分类分为两大类
21:内部排序
内部排序是指将需要处理的所有数据一次性都加载到内存中进行排序的。
如:冒泡、快排等这些算法都是内部排序的
22:外部排序
数据量过大,无法全部加载到内存中,需要借助于外部存储进行排序的。
如:数据库中数据8个G,内存只有4个G的这种。
23:参加分类如下图:
三:算法的时间复杂度
31:分类
衡量一个程序(算法)执行时间有两种方法
311:事后统计的方法
所谓的事后统计方法,顾名思义,就是程序(算法)已经写完了,运行后得到的结果。
这种方法虽然是可行的,但是有两个问题:
①:要想对设计的算法运行的性能进行评估,需要实际运行该程序(浪费时间);
②:运行所得的时间统计严重依赖于机器的硬件、软件等环境因为。
这种方法有个严苛的要求:要在同一台机器在相同状态(软硬件)下运行,才能比较哪个算法更快。
312:事前估算的方法
通过分析某个算法的时间复杂度来判断哪个算法更优。
32:时间频度
概念:一个算法花费的时间与算法中语句执行的次数成正比。哪个算法中语句执行次数多,那么这个算法所花费的时间就多(这不废话吗)。
一个算法中语句执行次数称为语句频度或时间频度。记为:T(n)
(复杂的概念是,时间频度:一个算法执行所消耗的时间,从理论上是 不能算出来的,想要具体数值,必须要将程序上机运行测试才能知道。但是我们不可能也没必要对每个算法都上机进行测试的,只需要知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句执行的次数成正比的,哪个算法中语句执行次数多,那么这个程序花费的时间就多。一个算法中的语句执行次数称为语句频度或者时间频度,即为:T(n))
例如:我们知道的技术从1到100所有数字的和。这个就有两种算法。分别如下:
①:使用for循环,从1到100循环出来,然后累加出来。代码如下:
根据上面概念(注意对概念的理解,total和end这两行相对于for循环来说,可以忽略。后面我们还会详细讲解还会忽略哪些),我们来看下这个算法的时间频度是多少呢?
在for循环中,实际需要执行101次(+1的原因是因为,在for循环的时候,需要做最后一次判断,才能推出。因此n个数的计算一共是n+1次 *** 作)。所以其时间频度就是:T(n)=n+1;
我们再来看看第二种算法:
是不是很简单,只要一行代码就执行完成了。所以第二种算法的T(n)=1了。是不是很快呢?
时间频度是不是一眼就看出来了?是不是不用在代码运行下来比较运行时间了?
(ps:从上面简单地从1到100求和算法中,我们是不是感受到算法的魅力了?感受到编程之美了?)
33:时间复杂度
在上面32中提到的时间频度中,n称为问题的规模,当n不断变化的时候,时间频度T(n)也会不断变化。但是有时我们想知道它在变化的时候呈现什么样的规律呢?为此,我们引入了时间复杂度概念。
一般情况下,算法中基本 *** 作重复执行的次数是问题规模n的某个函数,用T(n)表示。若有某个辅助函数f(n),是的当n趋近于无穷大的时候,T(n)/f(n)的极限值为不等于零的参数,则称为f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进的时间复杂度。简称时间复杂度。这就是大O法。
在计算时间复杂度的时候,我们会忽略以下几个数据值
331:忽略常数项
比如上面,我们计算1到100的第一种算法中,有两行int total=0;和 int end = 100;这两行代码,这个数值是2,我们一般计算时间复杂度的时候,会忽略这个常数项的。为什么呢?请看下面四个函数,随着n的增大而增大运行时间。
T(n) = 2n+20
T(n) = 2n
T(n)=3n+10
T(n)=3n
请看下图随着n的增大所呈现的规律:
我们来看看,把这些数据使用折线图展示:
图例说明:上面两个是3n及3n+10的,下面两个是2n及2n+10的
从上面两个图表中我们可以得到以下结论:
①:2n+20和2n随着n的增加,执行曲线无限接近(折线图中下面两个),常量值20可以忽略了
②:3n+10和3n随着n的增加,执行曲线无限接近(折线图中上面两个),常量值10可以忽略了
所以,综上所述,在计算程序(算法)时间复杂度的时候,常量值是可以忽略的
332:忽略低次项
请看下面四个函数,随着n的增大又会呈现什么规律吗?
T(n)=2n^2+3n+10
T(n)=2n^2
T(n)=n^2+5n+20
T(n)=n^2
说明:n^2表示n的2次方
我们来看看随着n的增加,运行所消耗的时间。如下图:
把上面数据,用折线图表示,如下图:
图例说明:上面两个是2n^2及2n^2+3n+10,下面两个是n^2及 n^2+5n+20
从上面两个图中我们可以得到如下结论:
①:2n^2+3n+10和2n^2随着n的增大,执行曲线无限接近,可以忽略低次项及常量项:3n+10
②:n^2+5n+20和n^2随着n的增大,执行曲线无限接近,可以忽略低次项及常量项:5n+20
综上所述,我们可以得到结论:在计算程序(算法)时间复杂度的时候,低次项(3n=3n^1比n^2项数少)是可以忽略的
333:忽略系数
我们再来看看下面四个函数,看看它们随着n的增大呈现出什么样的规律
T(n)=3n^2+2n
T(n)=5n^2+7n
T(n)=n^3+5n
T(n)=6n^3+4n
随着n的增加,运行时间所消耗耗时如下图:
折线图如下:
从上图可以得到如下:
①:随着n值变大,5n^2+7n和3n^2+2n,执行曲线重合,说明这种情况下,系数5和3可以忽略;
②:n^3+5n和6n^3+4n,执行曲线分离,说明多少次方是关键
334:总结:
计算时间复杂度的时候忽略常数项、忽略低次项、忽略系数
T(n)不同,但时间复杂度可能相同。
如:T(n)=n2+7n+6与T(n)=3n^2+2n+2它们的T(n)不同,但时间复杂相同,都为O(n^2)
计算时间复杂度的方法用常数1代替运行时间中的所有加法常数T(n)=n^2+7n+6 =>T(n)=n^2+7n+1修改后的运行次数函数中,只保留最高阶项T(n)=n^2+7n+1 => T(n)=n^2去除最高阶项的系数T(n)=n^2 =>T(n)=n^2 => O(n^2)
34:常见的时间复杂度
常数阶O(1)
对数阶O(log2n)
线性阶O(n)
线性对数阶O(nlog2n)
平方阶O(n^2)
立方阶O(n^3)
K次方阶(n^k)
指数阶O(2^n)
各个时间复杂度复杂度折线图如下图:
总结:
常见算法时间复杂度由小到大依次为:
O(1)
从上图折线图中,我们可以看出,程序(算法)尽可能的避免使用指数阶段的算法。
35:常见算法时间复杂度举例
351:常数阶O(1)
无论代码执行多少行,只要是没有循环等复杂结构,那这个代码的时间复杂度就是O(1)
(计算时间复杂度的时候,忽略常数项)
代码demo:
上述代码在执行的时候,消耗的时间并不是随着某个变量的增长而增长,那么无论这类代码有多长,即使有有几万几十万行,都是可以用O(1)来表示它的时间复杂度。
352:对数阶O(log2n)
代码敬上:
说明:
在while循环里面,每次都是将i2的。n的值是固定的,所以在i乘完之后,i距离n就越来越近了。假设循环x次之后,i就大于n了,此时这个循环就退出了。也就是说2的x次方等于n了。那么x=log2n。也就是说当循环了log2n次以后,代码就结束了。因此这个代码的时间复杂度就是
O(log2n)。
O(log2n)的这个2时间上是随着代码变化的。如果i = i3,那么时间复杂度就是O(log3n)
回顾下log的理解(这是初中知识点):
如果a的x次方等于N(a>0,且a≠1),那么熟x就叫做以a为底的对数(logarithm),记作x=logaN
其中,a叫做对数的底数,N叫做真数,x叫做“以a为底N的对数”。
353:线性阶O(n)
代码如下:
说明:
这段代码,for循环里面的代码会执行n次。因此它所消耗的时间随着n的变化而变化的,因此这类代码都是可以用O(n)来表示它的时间复杂度。
354:线性对数阶O(nlogn)
代码如下:
说明:
线性对数阶O(nlogN)其实非常容易理解的。将时间复杂度为O(logn)的代码循环了N次的话,那么它的时间复杂度就是nO(logn),也就是O(nlogN)
355:平方阶O(n2)
代码:
说明:
平方阶O(n2)就容易理解了。如果把O(n)的代码再嵌套循环一遍,它的时间复杂度就是O(n2),
上图中的代码起始就是嵌套了2层n循环,它的时间复杂度就是O(nn),即时O(n2)。如果将其中一层循环的n修改成m,那么它的时间复杂度就变成了O(mn)
356:立方阶O(n3)、K次方阶O(n^k)
说明:参考上面的O(n2)去理解就好了。O(n3)起始就相当于是三层n循环了。其他的一次类推。
36:平均时间复杂度和最坏时间复杂度
平均时间复杂度:
是指所有可能的输入实例均以概率出现的情况下,该算法的运行时间
最坏时间复杂度:
是指在最坏情况下的时间复杂度称为最坏时间复杂度。一般讨论时间复杂度均是最坏情况下的时间复杂度。
这样做的原因:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的界限。这就保证了算法的运行时间不会比最坏情况更长了。
平均时间复杂度和最坏时间复杂度是否一致,和算法有关。具体如下图:
四:算法的空间复杂度
空间复杂度介绍
类似于时间复杂度的讨论。一个算法的空间复杂度(Space Complexity)定义为该算法所消耗的存储空间,它也是问题规模n的函数;
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。有的算法需要占用临时工作单元数与解决问题的规模n有关。它们随着n的增大而增大,当n较大的时候,将占用较多的存储单元(存储空间)。例如:在快排(快速排序)和归并排序算法就属于这种情况。
在做算法分析的时候,主要讨论的是时间的复杂度。因为从用户的使用体验上来看,更看重的是程序执行的速度的快慢。一般缓存产品(比如Redis)和技术排序算法本质就是拿空间换时间的。
下节预告:
下节我们将讲讲冒泡排序和选择排序。使用的是图解+代码一步一步推导出来演示的。欢迎大家一起学习
范围值大时,需要取log。
matlab图像傅里叶变换与反变换
实验原理:
傅里叶变换是一种函数在空间域和频域的变换,从空间域变到频域是傅里叶变换,从频域变到空间域是傅里叶反变换。在频域中,频率越大说明原始信号变化速度越快;频率越小说明原始信号变化越平缓。高频分量解释信号的突变部分,低频分量决定信号的整体形象。
在图像处理中,频域反应了图像在空域中灰度的变化速度,也就是图像的梯度大小。对图像而言,图像的边缘部分是突变部分,变化较快,因此反应在频域上是高频分量;图像的噪声大部分情况下是高频部分,图像变化平缓的部分则为低频分量。
采用快速傅里叶变换(FFT)算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点N越多,FFT算法计算量的节省就越显著。
代码实现:
clear;clc;close
%读入uint8类型 灰度图
img = imread('08png');
%变换之后为complex double类型
imgfft = fft2(img);
%abs求模
imgfft2 = log(abs(imgfft));
%移中
imgfft3 = fftshift(imgfft);
imgfft4 = log(abs(imgfft3));
%反变换
imgfft5 = ifftshift(imgfft3);
imgfft6 = ifft2(imgfft5);
%画图
subplot(221)
imshow(img,[])
title('原图')
subplot(222)
imshow(imgfft2,[])
title('频谱图')
subplot(223)
imshow(imgfft4,[])
title('移中后的频谱图')
subplot(224)
imshow(imgfft6,[])
title('反变换')
注意:
1变换前需要将图像转成灰度图
2傅里叶变换后的结果为复数,需要用abs求其模,而模的值范围较大需要用log进行缩放
3imshow(T,[])会根据灰度图的数值范围来显示图像
1 对 网和图区别是带不带“权”也就是权值 网是有的 而图是没有的
2 对 初始数据表倒序时冒泡相比其他情况下的冒泡确实比较次数最多。。。。但如果是冒泡和其 他排序算法比较的话,不单只有倒叙时冒泡执行次数比其他排序算法多
3对 中序遍历(LDR)是二叉树遍历的一种 中序 先序可以确定二叉树 中序 后序也可以确定二叉 树
4 错 中根顺序是 左中右 搜索二叉树 左<中<右 故得到有序序列
5 错 快速排序最坏情况下时间复杂度是O(n^2),和冒泡排序一样,最好的情况是O(nlogn)。不过实践 证明,一般情况下快速排序还是能够达到很好的效果的。
如果待排的序列n比较小,用冒泡排序是很好的办法。简单高效。
堆排序的时间复杂度也是O(nlogn),而且只需要一个额外的辅助空间。
总的说来,没有最好的排序算法,要看排序的规模和对于辅助空间的要求。一般说来,快速排序 确实是不错的排序算法
第一种方法(穷举法)void findSame(Type A[], TypeB[], Type C[]){ //设数组C = A + B(当然C没必要) for(int i = 0; i < Csize(); ++i) { for(int j = i + 1; j < Csize(); ++j) { compare(); } } 时间复杂度:n^2(n^2/2 - n /2);}第二种方法void findSame(Type A[], Type B[], Type C[]){ sort(A); sort(B); for(int i = 0; i < Asize(); ++i) { //先在已排序的A中找相同记录(略) //再在已排序的B中找相同记录(二分查找) } 时间复杂度nlogn(mlogm + nlogn + m + mlogn)应该比在一个数组中快,在一个数组时间复杂度:(m + n)logn + (m + n) 那为了更快,可再划分更多的小数组,使得排序的时间降下来}
以上就是关于ASP连接数据库的问题全部的内容,包括:ASP连接数据库的问题、X分之3.6等于3分之二节比例、matlab中为什么傅里叶逆变换后要取log等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)