1. 离散拉普拉斯算法和连续拉普拉斯算法有什么区别
离散的是不连续的,比如1,2,3,4,5
连续的是不间断的,比如1~5;
离散拉普拉斯算法适用于离散的函数,连续拉普拉斯算法适用于连续的函数
2. C#求连续数字的算法
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
/*
*先排序(用sort方法),再依次求连续的数字的个数,选择最长的打印。
*/
{
classProgram
{
staticvoidMain(string[]args)
{
intnTmpStart=0;
intnResultStart=0;
intnTmpConsecutiveNum=1;
intnResultConsecutiveNum=0;
int[]num={1,4,6,5,8,9,10,15,3,19,18,21,20,21,17};
Array.Sort(num);
nTmpStart=num[0];
for(inti=1;i<num.Length;i++)
{
if(num[i]==num[i-1])
{
if(i==num.Length-1)
{
if(nTmpConsecutiveNum>nResultConsecutiveNum)
{
nResultConsecutiveNum=nTmpConsecutiveNum;
nResultStart=nTmpStart;
}
}
else
{
continue;
}
}
elseif(num[i]==(num[i-1]+1))
{
nTmpConsecutiveNum++;
if(i==num.Length-1)
{
if(nTmpConsecutiveNum>nResultConsecutiveNum)
{
nResultConsecutiveNum=nTmpConsecutiveNum;
nResultStart=nTmpStart;
}
}
}
else
{
if(nTmpConsecutiveNum>nResultConsecutiveNum)
{
nResultConsecutiveNum=nTmpConsecutiveNum;
nResultStart=nTmpStart;
}
nTmpStart=num[i];
nTmpConsecutiveNum=1;
}
}
Console.WriteLine("最长连续数字:");
for(intj=0;j<nResultConsecutiveNum;j++)
{
Console.Write("{0} ",nResultStart+j);
}
Console.WriteLine();
}
}
}
3. 算法实现——连续和问题
//VC 2005 测试通过
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int GetCount( int num )
{
//如果27=27 , 也算作在内请把cnt赋值为1
int sum=0, cnt=0;
int index=0, i=0;
while ( i <= num /2 +1 )
{
sum = i * (i+1) /2 - index *(index-1) /2;
if ( sum == num )
{
//cout<<endl<<num<<"="<<index;
//for ( int k=index+1; k<=i; k++ )
//{
//cout<< "+"<<k;
//}
index=++i;
cnt++;
}
else if ( sum > num )
{
index++;
}
else
{
i++;
}
}
return cnt;
}
void main()
{
int num=0;
string inPath="c:\\inFile.txt";
string outPath="c:\\outFile.txt";
ifstream inFile( inPath.c_str(), ios_base::in);
if ( !inFile )
{
cerr<<"Open file :" << inPath <<" failed! Exit....";
return;
}
ofstream outFile( outPath.c_str(), ios_base::out );
if ( !outFile )
{
cerr<< "Open file: " << outPath <<" failed! Exit...";
return;
}
while ( !inFile.eof() )
{
if ( inFile >>num )
{
outFile<<GetCount(num) <<endl;
}
else
{
inFile.clear();
inFile.get();
}
}
inFile.close();
outFile.close();
cout<<"\nEnter key to exit...";
cin.get();
}
4. 求最大连续区间和的几种方法
定义最大连续区间和:给定一个长度为n的序列a[1],a[2]...a[n],求一个连续的子序列a[i],a[i+1]...a[j-1],a[j]使得a[i]+a[i+1]...+a[j-1]+a[j]最大。
1、根据定义来枚举:枚举上下界i,j,维护一个max值
其中枚举上下界的复杂度为O(n²),求区间和复杂度为O(n),所以总的时间复杂度是O(n^3)。
for(int i = 1; i <= n ; i++)
for(int j = i; j<= n; j++)
ans = max(ans,accumulate(a+i,a+j+1,0));
2、对求区间和的操作做预处理,令sum[i] = a[0] + a[1] + a[2] ... + a[i-1] + a[i] 计算区间和的复杂度可降为O(1),枚举上下界的复杂度不变,所以总的时间复杂度为O(n²)。
for(int i =1;i<=n;i++)
sum[i] = sum[i-1] + a[i];
for(int i = 1; i <= n ; i++)
for(int j = i; j<= n; j++)
ans = max(ans,sum[j]-sum[i-1]);
3、利用动态规划的思维来继续优化,得到一个线性的基本算法,也是基本连续子区间和的标准算法:
定义maxn[i]为以i为结尾的最大连续和,则很容易找到递推关系:maxn[i] = max{0,max[i-1] + a[i]}
所以只要扫描一遍即可,总时间复杂度为O(n)。
for(int i =1; i <= n; i++)
{
last = max(0,maxn[i-1]) + a[i];
ans = max(ans,last);
}