当前位置:  编程技术>综合
本页文章导读:
    ▪0006算法笔记——线性时间选择                线性时间选择问题:给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素,(这里给定的线性集是无序的)。        1.........
    ▪C++ Builder 2010 如何调用Vs2008创建出的C++的DLL      1.创建一个VS2008的C++的DLL工程 2.导出DLL结果为C方式,即如下代码示: #pragma once #include"TestClass.h" #ifdef INTERFACE_EXPORTS #define INTERFACE_API __declspec(dllexport) #else #define INTERFACE_API __declspec.........
    ▪邮件的发送      最近做一个项目涉及到如何发送邮件,起初做的时候也是很迷茫,稍微到网上百度了一些资料,但发现网上有些代码并不能执行,于是自己对此作了些总结,下面将自己的经验和大家一起分享.........

[1]0006算法笔记——线性时间选择
    来源: 互联网  发布时间: 2013-11-10

          线性时间选择问题:给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素,(这里给定的线性集是无序的)。

       1、随机划分线性选择

       线性时间选择随机划分法可以模仿随机化快速排序算法设计。基本思想是对输入数组进行递归划分,与快速排序不同的是,它只对划分出的子数组之一进行递归处理。

       程序清单如下:

//2d9-1 随机划分线性时间选择
#include "stdafx.h"
#include <iostream> 
#include <ctime>
using namespace std; 

int a[] = {5,7,3,4,8,6,9,1,2};

template <class Type>
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 <class Type>
int Partition(Type a[],int p,int r)
{
	int i = p,j = r + 1;
	Type x = a[p];

	while(true)
	{
		while(a[++i]<x && i<r);
		while(a[--j]>x);
		if(i>=j)
		{
			break;
		}
		Swap(a[i],a[j]);
	}
	a[p] = a[j];
	a[j] = x;
	return j;
}

template<class Type>
int RandomizedPartition(Type a[],int p,int r)
{
	int i = Random(p,r);
	Swap(a[i],a[p]);
	return Partition(a,p,r);
}

template <class Type>
Type RandomizedSelect(Type a[],int p,int r,int k)
{
	if(p == r)
	{
		return a[p];
	}
	int i = RandomizedPartition(a,p,r);
	int j = i - p + 1;
	if(k <= j)
	{
		return RandomizedSelect(a,p,i,k);
	}
	else
	{
		//由于已知道子数组a[p:i]中的元素均小于要找的第k小元素
		//因此,要找的a[p:r]中第k小元素是a[i+1:r]中第k-j小元素。
		return RandomizedSelect(a,i+1,r,k-j);
	}
}

int main()
{
	for(int i=0; i<9; i++)
	{
		cout<<a[i]<<" ";
	}
	cout<<endl;
	cout<<RandomizedSelect(a,0,8,3)<<endl;
}

       程序解释:利用随机函数产生划分基准,将数组a[p:r]划分成两个子数组a[p:i]和a[i+1:r],使a[p:i]中的每个元素都不大于a[i+1:r]中的每个元素。接着"j=i-p+1"计算a[p:i]中元素个数j.如果k<=j,则a[p:r]中第k小元素在子数组a[p:i]中,如果k>j,则第k小元素在子数组a[i+1:r]中。注意:由于已知道子数组a[p:i]中的元素均小于要找的第k小元素,因此,要找的a[p:r]中第k小元素是a[i+1:r]中第k-j小元素。

      在最坏的情况下,例如:总是找到最小元素时,总是在最大元素处划分,这是时间复杂度为O(n^2)。但平均时间复杂度与n呈线性关系,为O(n)(数学证明过程略过,可参考王云鹏论文《线性时间选择算法时间复杂度深入研究》)。

      2、利用中位数线性时间选择

      中位数:是指将数据按大小顺序排列起来,形成一个数列,居于数列中间位置的那个数据。

      算法思路:如果能在线性时间内找到一个划分基准使得按这个基准所划分出的2个子数组的长度都至少为原数组长度的ε倍(0<ε<1),那么就可以在最坏情况下用O(n)时间完成选择任务。例如,当ε=9/10,算法递归调用所产生的子数组的长度至少缩短1/10。所以,在最坏情况下,算法所需的计算时间T(n)满足递推式T(n)<=T(9n/10)+O(n)。由此可得T(n)=O(n)。

     实现步骤:

      (1)将所有的数n个以每5个划分为一组共组,将不足5个的那组忽略,然后用任意一种排序算法,因为只对5个数进行排序,所以任取一种排序法就可以了。将每组中的元素排好序再分别取每组的中位数,得到个中位数。

      (2)取这个中位数的中位数,如果是偶数,就找它的2个中位数中较大的一个作为划分基准。

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

      

       程序清单如下:       

//2d9-2 中位数线性时间选择
#include "stdafx.h"
#include <ctime>
#include <iostream> 
using namespace std; 

template <class Type>
void Swap(Type &x,Type &y)
{
	Type temp = x;
	x = y;
	y = temp;
}

inline int Random(int x, int y)
{
     int ran_num = rand() % (y - x) + x;
     return ran_num;
}

//冒泡排序
template <class Type>
void BubbleSort(Type a[],int p,int r)
{
	 //记录一次遍历中是否有元素的交换   
     bool exchange;  
     for(int i=p; i<=r-1;i++)  
     {  
		exchange = false ;  
        for(int j=i+1; j<=r; j++)  
        {  
			if(a[j]<a[i])  
            {  
                Swap(a[j],a[i]); 
                exchange = true;  
            }   
        }   
        //如果这次遍历没有元素的交换,那么排序结束   
        if(false == exchange)  
		{
             break ;  
		}
	 }
}

template <class Type>
int Partition(Type a[],int p,int r,Type x)
{
	int i = p,j = r + 1;

	while(true)
	{
		while(a[++i]<x && i<r);
		while(a[--j]>x);
		if(i>=j)
		{
			break;
		}
		Swap(a[i],a[j]);
	}
	a[p] = a[j];
	a[j] = x;
	return j;
}


template <class Type>
Type Select(Type a[],int p,int r,int k)
{
	if(r-p<75)
	{
		BubbleSort(a,p,r);
		return a[p+k-1];
	}
	//(r-p-4)/5相当于n-5
	for(int i=0; i<=(r-p-4)/5; i++)
	{
		//将元素每5个分成一组,分别排序,并将该组中位数与a[p+i]交换位置
		BubbleSort(a,p+5*i,p+5*i+4);
		Swap(a[p+5*i+2],a[p+i]);
	}
	//找中位数的中位数
	Type x = Select(a,p,p+(r-p-4)/5,(r-p-4)/10);
	int i = Partition(a,p,r,x);
	int j = i-p+1;
	if(k<=j)
	{
		return Select(a,p,i,k);
	}
	else
	{
		return Select(a,i+      
    
[2]C++ Builder 2010 如何调用Vs2008创建出的C++的DLL
    来源: 互联网  发布时间: 2013-11-10

1.创建一个VS2008的C++的DLL工程

2.导出DLL结果为C方式,即如下代码示:

#pragma once
#include"TestClass.h"
#ifdef INTERFACE_EXPORTS
#define INTERFACE_API __declspec(dllexport)
#else
#define INTERFACE_API __declspec(dllimport)
#endif

extern "C"
{
	INTERFACE_API bool Initialize(void);
	INTERFACE_API int ADD(int a, int b);
	INTERFACE_API void Destory(void);
};

3.编译该工程,生成DLL为A.DLL

4.打开RAD Studio Command Prompt,进入A.DLL所在的目录

5.使用命令:implib -a A.lib A.dll 生成C++ builder能识别的lib

6.打开C++ Builder 2010 创建一个新的工程,点击菜单Project->Add to Porject 把刚生成lib添加到C++ Builder的工程中。

7.在使用的地方对上述三个函数进行声明,声明格式如下:

extern "C" __declspec(dllimport) bool __cdecl Initialize(void);
extern "C" __declspec(dllimport) int __cdecl ADD(int a, int b);
extern "C" __declspec(dllimport) bool __cdecl Destory(void);

8.在C++ Builder 2010下便可以使用该三个函数进行操作了。


作者:wziyx513225244 发表于2013-1-8 17:34:07 原文链接
阅读:23 评论:0 查看评论

    
[3]邮件的发送
    来源: 互联网  发布时间: 2013-11-10

最近做一个项目涉及到如何发送邮件,起初做的时候也是很迷茫,稍微到网上百度了一些资料,但发现网上有些代码并不能执行,于是自己对此作了些总结,下面将自己的经验和大家一起分享下。

·        主要代码如下:

public ActionResultAskForLeave(string subject,string fromAddress, stringtoAddress)

        {

             SmtpClientsmtp = new SmtpClient("smtp.gmail.com", 587);

             smtp.EnableSsl = true;

             MailAddressfromAdd = new MailAddress(fromAddress,"sender");

             MailAddresstoAdd = new MailAddress(toAddress,"receiver");

             MailMessagemessage = new MailMessage(fromAdd,toAdd);

             message.Subject = subject;

             message.Body = body;

             smtp.Credentials = new NetworkCredential(fromAddress,"发件人的密码");

             //message.Priority= MailPriority.High;

             //smtp.DeliveryMethod= SmtpDeliveryMethod.Network;

             //smtp.UseDefaultCredentials= true;

             //smtp.Timeout= 2000;

 

             try

             {

                   smtp.Send(message);

                  returnRedirectToAction("Successful", "Home");

             }

             catch(Exception e)

             {

                  Console.WriteLine("Exception is:" + e.ToString());

             }

             returnView();

        }

由于我是通过MVC做的,可能在你写代码时需要做一些修改,方法中的三个参数subject,fromAddress,toAddress分别为邮件标题,发件箱,收件箱

·        值得说明的是SmtpClient("smtp.gmail.com",587);

这当中的587定义的是发件箱的端口号,我这里用的是gamil.com邮箱,如果你想用其它邮箱如163,你还得修改成163邮箱的端口号。

·        还有一点很重要             smtp.EnableSsl = true;

这一句代码看似很简短,但是你必须把它加上,这是决定你邮件是否能成功发送的关键之处。

它的意思是定义Ssl是否能访问SMTP邮箱的服务器,而且这句话必须写在发送邮件语句之前,否则的话就无法访问服务器,也就不能发送了,起初我自己被这个问题困扰了许久,反复阅读代码都没有找出原因,所以在这个问题上浪费了许多时间与精力,在这里我把它标记出来,希望读者不要像我这样走入误区。

至于其它几句代码意义就比较明了

MailAddress fromAdd = newMailAddress(fromAddress, "sender");//设置你的发件箱

同理

MailAddress toAdd = newMailAddress(toAddress, "receiver");//设置收件人邮箱

   smtp.Credentials = newNetworkCredential(fromAddress, "发件人的密码");//你邮箱的密码

上面我注释掉的一些语句,自己可以加上进行属性设置,当然不加也可以成功发送。

希望能对大家有点帮助哦

 

 

作者:kiqiNie 发表于2013-1-8 17:27:41 原文链接
阅读:31 评论:0 查看评论

    
最新技术文章:
▪error while loading shared libraries的解決方法    ▪版本控制的极佳实践    ▪安装多个jdk,多个tomcat版本的冲突问题
▪简单选择排序算法    ▪国外 Android资源大集合 和个人学习android收藏    ▪.NET MVC 给loading数据加 ajax 等待loading效果
▪http代理工作原理(3)    ▪关注细节-TWaver Android    ▪Spring怎样把Bean实例暴露出来?
▪java写入excel2007的操作    ▪http代理工作原理(1)    ▪浅谈三层架构
▪http代理工作原理(2)    ▪解析三层架构……如何分层?    ▪linux PS命令
▪secureMRT Linux命令汉字出现乱码    ▪把C++类成员方法直接作为线程回调函数    ▪weak-and算法原理演示(wand)
▪53个要点提高PHP编程效率    ▪linux僵尸进程    ▪java 序列化到mysql数据库中
▪利用ndk编译ffmpeg    ▪活用CSS巧妙解决超长文本内容显示问题    ▪通过DBMS_RANDOM得到随机
▪CodeSmith 使用教程(8): CodeTemplate对象    ▪android4.0 进程回收机制    ▪仿天猫首页-产品分类
▪从Samples中入门IOS开发(四)------ 基于socket的...    ▪工作趣事 之 重装服务器后的网站不能正常访...    ▪java序列化学习笔记
▪Office 2010下VBA Addressof的应用    ▪一起来学ASP.NET Ajax(二)之初识ASP.NET Ajax    ▪更改CentOS yum 源为163的源
▪ORACLE 常用表达式    ▪记录一下,AS3反射功能的实现方法    ▪u盘文件系统问题
▪java设计模式-观察者模式初探    ▪MANIFEST.MF格式总结    ▪Android 4.2 Wifi Display核心分析 (一)
▪Perl 正则表达式 记忆方法    ▪.NET MVC 给loading数据加 ajax 等待laoding效果    ▪java 类之访问权限
▪extjs在myeclipse提示    ▪xml不提示问题    ▪Android应用程序运行的性能设计
▪sharepoint 2010 自定义列表启用版本记录控制 如...    ▪解决UIScrollView截获touch事件的一个极其简单有...    ▪Chain of Responsibility -- 责任链模式
▪运行skyeye缺少libbfd-2.18.50.0.2.20071001.so问题    ▪sharepoint 2010 使用sharepoint脚本STSNavigate方法实...    ▪让javascript显原型!
论坛 iis7站长之家
▪spring+hibernate+事务    ▪MyEclipse中文乱码,编码格式设置,文件编码格...    ▪struts+spring+hibernate用jquery实现数据分页异步加...
▪windows平台c++开发"麻烦"总结    ▪Android Wifi几点    ▪Myeclipse中JDBC连接池的配置
▪优化后的冒泡排序算法    ▪elasticsearch RESTful搜索引擎-(java jest 使用[入门])...    ▪MyEclipse下安装SVN插件SubEclipse的方法
▪100个windows平台C++开发错误之七编程    ▪串口转以太网模块WIZ140SR/WIZ145SR 数据手册(版...    ▪初识XML(三)Schema
▪Deep Copy VS Shallow Copy    ▪iphone游戏开发之cocos2d (七) 自定义精灵类,实...    ▪100个windows平台C++开发错误之八编程
▪C++程序的内存布局    ▪将不确定变为确定系列~Linq的批量操作靠的住...    ▪DIV始终保持在浏览器中央,兼容各浏览器版本
▪Activity生命周期管理之三——Stopping或者Restarti...    ▪《C语言参悟之旅》-读书笔记(八)    ▪C++函数参数小结
▪android Content Provider详解九    ▪简单的图片无缝滚动效果    ▪required artifact is missing.
▪c++编程风格----读书笔记(1)    ▪codeforces round 160    ▪【Visual C++】游戏开发笔记四十 浅墨DirectX教程...
▪【D3D11游戏编程】学习笔记十八:模板缓冲区...    ▪codeforces 70D 动态凸包    ▪c++编程风格----读书笔记(2)
▪Android窗口管理服务WindowManagerService计算Activity...    ▪keytool 错误: java.io.FileNotFoundException: MyAndroidKey....    ▪《HTTP权威指南》读书笔记---缓存
▪markdown    ▪[设计模式]总结    ▪网站用户行为分析在用户市场领域的应用
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3