当前位置:首页 » 操作系统 » 算法设计软件

算法设计软件

发布时间: 2024-01-27 05:03:47

⑴ 数据结构和算法在实际的软件开发中都有哪些

应用太多了。

基本上来说C#是基于面向对象语言,你所定义的所有类/结构体都算是数据结构,而且在.net类库中已经定义中诸多可用的类型以供使用。实际开发中根本就离不开结构与算法。

题主之所以有这样的问题,基本上认识到了很多程序员易犯的一个毛病——理论知识与实际应用中的脱节问题,不少程序员都说自己写程序用不上理论知识,或者是理论无用。我一直认为理论才是真正编程的指导,别说你所学的理论知识了,有时我们必须遵守一些软件活动上的标准/规范/规定。比如ISO29500标准有多少程序员读过或听说过?他实事就是关于openxml的一个国际标准,我们要想达到通用的程序,这些标准还是读一读的好。

扯回你的问题,什么是数据结构,什么是算法?如果你真的狭义理由数据结构,或者只是从课本上例子来说,数据结构被定义成一个只有属性成员的类或结构体才算是数据结构吗?事实上并不是,那么是不是只有链表/栈/队列才算是数据结构呢?可以说这是某些人狭义理解数据结构时的一种常规定势思维,但事实上来说,类或结构是数据结构的基本,否则你链表存在的实体到底是什么东西?所以数据结构包含着基本结构与狭义上的顺序表/链表/栈/队等存在实体的集体。为什么我说数据结构在实际运用中广泛体现呢?就数据结构而言,课本上只是为了讲明白结构而已,弱化了其中实体的真正含义,而且不语言的具体实现亦不尽相同,所以他们所讲的数据结构是基本理论的。

我来个例子:链表(C#语言)

publicclassMember
{
publicstringName{get;set;}
publicstringResponsibility{get;set;}
publicstringPosotion{get;set;}
}

publicclassMemberNode
{
publicMemberMember{get;set;}
publicMemberNext{get;set;}
}

//Node其他就是链表中的一个结点结构,这个结点结构除了指明当前的Member之下还指向下Next的下一个结构结构,它最终可以形成一个链表。这就是定义的一个链表。

从以上例子上你可以看出这是一个类似于课本的标准定义,但事实上在C#语法中存在泛型的特点,那么这类似的结构我们不须要一个个地定义了!所以在不同的语言中为了方便编程者,我们甚至可以把这样的结构进行简单化,从而达到一种最简单的使用方式。以C#为例,我们可以使用Node<T>来表示链表/List<T>表示顺序表/Stack<T>表示栈/Queue<T>表示队列,在这种情况下,我们只需要定义我们的泛型即可,结构链之类的本身使用泛型已经在类库中实现了——虽然你不用定义,但不代表不使用或者不用理解这其中的知识。而在课本讲理论的时候,他不可能附带泛型来讲的,所以很多人认为自己去定义数据结构才行,那才是“真正”的数据结构,其实不然。以链表为例,我们需要一个节点除了其实体意义之外,还存在指向下一结点的指针(其实是地址引用)才算是数据结构。根据课本,他们必须这么定义(C#):

publicclassMemberNode
{
publicstringName{get;set;}
publicstringResponsibility{get;set;}
publicstringPosition{get;set;}

publicMemberNodeNext{get;set;}
}
//死读书的只会承认这种才是真正的数据结构吧(链表节点)

事实上,链表讲的只是一种形式,能最终形成的一种组织数据结构的形式。这个代码会导致我们出现一种极大的误解——每个类型的结构都需要重新定义一次。如果有多个类型结构的话,我们会出现多个不同的定义,这会导致将来类的定义越来越多,对于维护上来说是比较麻烦的。由于设计模式/面向切片等各种开发方式的介入,我们会使用相对比较简单的形式。所以才会有我定义两个类的进步,而后可以出现泛型的更进一步。

你可以这样理解,这种课本上的结构,会导致我们造成每种结构基本上都需要重新定义一次,我最开始给出的例子可以使用继承的方式,实现某个基类的数据结构(下面的似乎也行,但在使用中可能会出现部分问题),而Node<T>则从根本上解决了这个问题,可以支撑多种类型。

所以此时在理解数据结构时,比如Node<T>,他不旦要求理解链表的节点,还要理解T泛型,那么在数据结构上来说,它指的不再是单一的节点结构,还在包括一个基础的类型。

换句话来说,你在C#等语言中已经不需要再做类似的定义了,只需要定义其基本结构类型即可。但课本上在讲知识的时候,它不可能只针对面向对象或支持泛型的语言来讲,若不支持泛型时,我们必须使用课本上或我最开始写的例子中的形式,若不支持继承的面向过程语言,那么课本上的知识就是硬性的规定,你必须以这种形式来说,而引用则使用指针引用的方式(面向对象的引用其实是一种引用型引用,也就是址引用或称地址引用,与指针类似)。

相信讲到这里你能明白,数据结构在不同的语言中只是变了个形而已,并不是必须是存在指针的才是,也不是只说表面上的那点东西。早期教程都是以fortain语言为主的,而且课本的目的是讲清道理,而不是一种规定。死读书的人以为用不到数据结构,其实他们一直在使用。

再来说一下算法,算法是什么?是解决问题的一种模式,比如解二元一次方程等等,所以算法的定义其实已经告诉你,顺序代码他也算是一种算法,不能说只有背包问题,八皇后问题,回溯问题才算是算法——你能明白吗?其实你正常写的就是一种算法,这种算法简单,就是顺序执行下来就可以了,他也是一种算法的,就算解二元一次方程组有固定的模式(算法),但不代表加减法就不是算法了!所以算法也是常用的东西,那么你学习的算法其实算是开辟思路的一种而已。算法自身的概念已经决定,基本上程序都是由结构与算法构成。我也来举个例子,怎么判断某个链表是否为循环链表?是你的回溯算法,贪心算法还是背包算法?它们只是在解决一些典型问题的一种通用方式而已,很显然,我的问题不是这种典型问题,但不代表他不典型,我们正常的算法是设计两个变量等于头元素,然后开始进入循环,一个变量每次向下推一,即找到他下一个节点,而另一个变量每次找到其孙节点,就算当于两个变量一个每次向下推进一次,而另一个每点推进两次(如果可能),如果不是循环链表,则进两次的那个会在链表总长度的一半时,遇到空引用,否则会在某一时间两指针引用同一对象(不是对象相等,而是引用相同的对象),什么意思呢,好象两个人在圆型跑道上跑步,一个每秒1米,另一个每秒2米,同时同地同向出发,最归跑得快的那个会追上跑得慢的那个!当然这种情况下你也可以给他起个名字,叫“追及算法”?如果只有你学的那几个典型算法是算法的话,这个算不算算法?

现在我们的问题是,如果语言层面上已经实现了这些东西,那么这些理论我们是否可以不用理解就可以了?答案是可以——如果你只是一个不思进取的程序员或允许bug乱飞的没有责任心的编程人员的话,可以不用理解——毕竟有些人只是“混”饭吃而已!

理解了不会去应用,这就是典型的理论联系不到实际,他们也不知道自己的代码将如何控制。我举一个例子,由于性能等各方面的要求,我们要使用多线程对某些数据进行处理。怎么处理?不好人会使用多线程——他们定义一个临界资源,然后让多个线程在读取数据表(DataSet)时进行阻塞,然后每个线程去处理那些超时长的问题,处理完的时个再按这种方式读取数据——这样有问题吗?没有,这也算是算法的一种!反正如果编程代码有功底的话没有任何问题的,这种代码算不算优雅呢——很多人认为代码的优雅就是代码编写过程的形式或是良好的编程习惯!这里边其实用不到数据结构与算法的。

好吧,我承认,但如果我们换一句思路来看看,如果我用一个线程负责读取数据,并不停地放入到一个队列中,而多个线程从队列中不停地读取处理这些放入的数据,这样如何?我的意思是说,并没有直接在DataSet中处理,而是选择使用队列的方式。

我们看一个问题,这个队列Queue<T>,一个线程用来插入数据,多个线程用来读取数据,而且要保证不能重复,那么我们可以使用队列的安全版本(CorrentQueue<T>,在.net中如果非线程安全的情况下,多线程使用实应该找到其对应的安全版本或者控制线程安全)。

插入线程如果发现队列中的长度(容量)较大时,可以暂缓插入。这样可以保证队列的长度基本固定,占用内存得到控制(不是DataSet批量读来一大堆),由于使用安全队列,所以各线程不用考虑线程之间的安全问题,每个线程从队中获得数据并删除,可以保证数据只被处理一次。当然还可以考虑优雅的通知机制,插入线程在插入数据时通知处理线程启动,如果插入速度过快,发现插入数量达指定的长度(比如30个),停止插入,插入线程阻塞;处理处理再次处理时可通知插入线程再进行插入。

这也算是一种算法吧?它可以让插入线程与处理线程同时工作,而使用DataSet那种常规的结果时,只能是等待处理完或加入多个控制条件进行控制,既然这么控制的话,何不直接使用队列的方式?CorrentQueue<T>中的T也完全可以是一条记录DataRow嘛!

如果你认为第一种是你经常使用方式,那么算法对于你来说学与不学无所谓的,你必须使用自己的编程/调试功底以保证你的代码尽量很少出错或不出错。而如果你认为第二种方案优雅一些的话,那么你会认为你学习的算法与结构还是有用的,理论与实践结合了。

我之所以举这么一个例子,其实告诉你的无非是几点非常重要的信息:

  1. 你有选择算法的自由(只不过是代码质量、后期维护的问题)

  2. 如果你知道的较多的算法与结构,你会有更多的选择。

  3. 算法或结构在实际使用中,所谓的典型问题并不是使用场景和书上描述一模一样(试想一下,我第二种考虑的例子中,是不是跟书上比他不典型?其实也是非常典型的)

  4. 分析问题时,应该拿要点,而不是整体去套。(如果整体去套用的话,你肯定会想不到使用哪种结构或算法)

  5. 不管是数据结构/算法/设计模式都要求是灵活运用,而不是场景对比使用,也不是生搬硬套。

试想一下,你的背包问题,怎么可能公司也让你分拆包装?你的八皇后问题公司恰好让你下棋?你的贪心算法公司恰好让你找零钱?你的回溯算法公司恰好让你走迷宫?学不能致用的原因就是太死板——这几个举个例子的场景你再遇到或理能遇到的机率是非常小的,所以如果觉得学了没用,那就真没用了——只不过不是算法没用,而是人没人!

讲个小故事:从前一个家人的板凳坏了,要找一个合适的两股叉的树杈重新制做一个板凳腿,让孩子到树园里找了半天,孩子回来说“我都没见过有向下叉的树杈!他老爹气得要死——怎么会可能有向下长的树杈呢!这孩子是不是笨——你就不会把地刨了找一个向下分叉的树根!

算法也是一样,迷宫找路可以使用回溯算法,但不是所有的回溯算法都用于迷宫找路——它还可以用来设计迷宫!嘿嘿嘿!

⑵ 数学建模的方法有哪些

  1. 预测模块:灰色预测、时间序列预测、神经网络预测、曲线拟合(线性回归);

  2. 归类判别:欧氏距离判别、fisher判别等 ;

  3. 图论:最短路径求法 ;

  4. 最优化:列方程组 用lindo 或 lingo软件解 ;

  5. 其他方法:层次分析法 马尔可夫链 主成分析法 等 。

建模常用算法,仅供参考:

  1. 蒙特卡罗算法(该算法又称随机性模拟算法,是通过计算机仿真来解决 问题的算法,同时间=可以通过模拟可以来检验自己模型的正确性,是比赛时必 用的方法) 。

  2. 数据拟合、参数估计、插值等数据处理算法(比赛中通常会遇到大量的数 据需要处理,而处理数据的关键就在于这些算法,通常使用Matlab 作为工具) 。

  3. 线性规划、整数规划、多元规划、二次规划等规划类问题(建模竞赛大多 数问题属于最优化问题,很多时候这些问题可以用数学规划算法来描述,通 常使用Lindo、Lingo 软件实现) 。

  4. 图论算法(这类算法可以分为很多种,包括最短路、网络流、二分图等算 法,涉及到图论的问题可以用这些方法解决,需要认真准备) 。

  5. 动态规划、回溯搜索、分治算法、分支定界等计算机算法(这些算法是算 法设计中比较常用的方法,很多场合可以用到竞赛中) 。

  6. 最优化理论的三大非经典算法:模拟退火法、神经网络、遗传算法(这些 问题是用来解决一些较困难的最优化问题的算法,对于有些问题非常有帮助, 但是算法的实现比较困难,需慎重使用) 。

  7. 网格算法和穷举法(网格算法和穷举法都是暴力搜索最优点的算法,在很 多竞赛题中有应用,当重点讨论模型本身而轻视算法的时候,可以使用这种 暴力方案,最好使用一些高级语言作为编程工具) 。

  8. 一些连续离散化方法(很多问题都是实际来的,数据可以是连续的,而计 算机只认的是离散的数据,因此将其离散化后进行差分代替微分、求和代替 积分等思想是非常重要的) 。

  9. 数值分析算法(如果在比赛中采用高级语言进行编程的话,那一些数值分 析中常用的算法比如方程组求解、矩阵运算、函数积分等算法就需要额外编 写库函数进行调用) 。

  10. 图象处理算法(赛题中有一类问题与图形有关,即使与图形无关,论文 中也应该要不乏图片的,这些图形如何展示以及如何处理就是需要解决的问 题,通常使用Matlab 进行处理)。

⑶ 学关于数学建模的推荐书籍以及入门级使用的编程软件及教材

我也要参加今年九月份的数学建模比赛,以下是我们老师给我们的几点建议,希望对你有些帮助。

赛前学习内容
1建模基础知识、常用工具软件的使用
一、掌握建模必备的数学基础知识(如初等数学、高等数学等),数学建模中常用的但尚未学过的方法,如图论方法、优化中若干方法、概率统计以及运筹学等方法。
二、,针对建模特点,结合典型的建模题型,重点学习一些实用数学软件(如 Mathematica 、Matlab、Lindo 、Lingo、SPSS)的使用及一般性开发,尤其注意同一数学模型可以用多个软件求解的问题。
例如, 贷款买房问题: 某人贷款8 万元买房,每月还贷款880.87 元,月利率1%。
(1)已经还贷整6 年。还贷6 年后,某人想知道自己还欠银行多少钱,请你告诉他。
(2)此人忘记这笔贷款期限是多少年,请你告诉他。
这问题我们可以用 Mathematica 、Matlab、Lindo 、Lingo 等多个不同软件包编程求解
2 建模的过程、方法
数学建模是一项非常具有创造性和挑战性的活动,不可能用一些条条框框规定出各种模型如何具体建立。但一般来说,建模主要涉及两个方面:第一,将实际问题转化为理论模型;第二,对理论模型进行计算和分析。简而言之,就是建立数学模型来解决各种实际问题的过程。这个过程可以用如下图1来表示。

3常用算法的设计
建模与计算是数学模型的两大核心,当模型建立后,计算就成为解决问题的关键要素了,而算法好坏将直接影响运算速度的快慢答案的优劣。根据竞赛题型特点及前参赛获奖选手的心得体会,建议大家多用数学软件(Mathematica,Matlab,Maple,Lindo,Lingo,SPSS 等)设计算法,这里列举常用的几种数学建模算法.
(1)蒙特卡罗算法(该算法又称随机性模拟算法,是通过计算机仿真来解决问题的算法,同时可以通过模拟可以来检验自己模型的正确性,是比赛时必用的方法,通常使用Mathematica、Matlab 软件实现)。
(2)数据拟合、参数估计、插值等数据处理算法(比赛中通常会遇到大量的数据需要处理,而处理数据的关键就在于这些算法,通常使用Matlab 作为工具)。
(3)线性规划、整数规划、多元规划、二次规划等规划类问题(建模竞赛大多数问题属于最优化问题,很多时候这些问题可以用数学规划算法来描述,通常使用Lindo、Lingo 软件实现)。
(4)图论算法(这类算法可以分为很多种,包括最短路、网络流、二分图等算法,涉及到图论的问题可以用这些方法解决,需要认真准备,通常使用Mathematica、Maple 作为工具)。
(5)动态规划、回溯搜索、分治算法、分支定界等计算机算法(这些算法是算法设计中比较常用的方法,很多场合可以用到竞赛中,通常使用Lingo 软件实现)。
(6)图象处理算法(赛题中有一类问题与图形有关,即使与图形无关,论文中也应该要不乏图片的,这些图形如何展示以及如何处理就是需要解决的问题,通常使用Matlab 进行处理)。
(7)最优化理论的三大非经典算法:模拟退火法、神经网络、遗传算法(这些问题是用来解决一些较困难的最优化问题的算法,对于有些问题非常有帮助,但是算法的实现比较困难,需慎重使用,通常使用Lingo、 Matlab、SPSS 软件实现)。
4 论文结构,写作特点和要求
答卷(论文)是竞赛活动成绩结晶的书面形式,是评定竞赛活动的成绩好坏、高低,获奖级别的唯一依据。因此,写好数学建模论文在竞赛活动中显得尤其重要,这也是参赛学生必须掌握的。为了使学生较好地掌握竞赛论文的撰写要领,(1)要求同学们认真学习和掌握全国大学生数学建模竞赛组委会最新制定的论文格式要求且多阅读科技文献。(2)通过对历届建模竞赛的优秀论文(如以中国人民解放军信息工程学院李开锋、赵玉磊、黄玉慧2004 年获全国一等奖论文:奥运场馆周边的MS 网络设计方案为范例)进行剖析,总结出建模论文的一般结构及写作要点,去学习体会和摸索。

参加全国大学生数学建模竞赛应注意的问题
一、心里要有“底”
首先,赛题来自于哪个实际领地的确难以预料,但绝不会过于“专”,它毕竟是经过简化、加工的。大部分赛题仅凭意识便能理解题意,少数赛题的实际背景可能生疏,只需要查阅一些资料,便可以理解题意。其次,所有的赛题当然要用到数学知识,但一定不会过于高深。用得较多的有运筹学、概率与统计、计算方法、离散数学、微分方程等方面的一部分理论和方法,这些内容在赛前培训要学过一些,真的用到了,总知道在哪些资料中查找。
二、当断即断
在两个赛题中选择做哪一个不能久议不决,因为你们只有三天时间,一旦选定了,就不要再犹豫,更不要反复。选定了赛题之后,在讨论建模思路和求解方法时会有争论,但不能无休止地 争论,而应学会妥协。方案定下来后,全队要齐心协力地去做。
三、对困难要有足够的心理准备
“拿到题目就有思路,做起来一帆风顺”,哪有如此轻松的事?参加竞赛可以说是“自讨苦吃,以苦为乐”,竞赛三天中所经受的磨炼一定会终生难忘,并成为自己的一份精神财富。好多同学赛后说:“参赛会后悔三天,而不参赛则遗憾一生。”做“撞到枪口上”的赛题,不一定比“外行”强。如学机械的队员做机械方面的赛题,学投资的队员做投资方面的赛题,学统计的队员做统计方面的赛题,都有可能“聪明反被聪明误”,这些情况在全国赛区都曾发生过。这就需要大家多方面涉猎知识尽全能做到全面

关于数模竞赛的几本好书
▲ 姜启源,《数学模型(第二版)》,高等教育出版社
▲ 姜启源、谢金星、叶俊《数学建模(第三版)》,高等教育出版社
▲ 萧树铁等,《数学实验》,高等教育出版社
▲ 朱道元,《数学建模案例精选》,科学出版社
▲ 雷功炎,《数学模型讲义》,北京大学出版社
▲ 叶其孝等,《大学生数学建模竞赛辅导教材(一)~(四)》,湖南教育出版社
▲ 江裕钊、辛培清,《数学模型与计算机模拟》,电子科技大学出版社
▲ 杨启帆、边馥萍,《数学模型》,浙江大学出版社
▲ 赵静等,《数学建模与数学实验》,高等教育出版社,施普林格出版社
▲ 韩中庚, 《数学建模方法与应用》,高等教育出版社
▲杨启帆,《数学建模案例集》,高等教育出版社.

需要了解的基础学科
1.数学分析(高等数学)
2.高等代数 (线性代数)
3.概率与数理统计
4.最优化理论 (规划理论)
5.图论
6.组合数学
7.微分方程稳定性分析
8.排队论 不知道能不能帮上你

热点内容
sql存储过程区别 发布:2024-11-28 23:35:37 浏览:918
ms计算机需要什么配置 发布:2024-11-28 23:34:21 浏览:974
淘宝直接访问的流量 发布:2024-11-28 23:33:11 浏览:49
python发微博 发布:2024-11-28 23:29:31 浏览:725
sql清空命令 发布:2024-11-28 22:58:53 浏览:487
melpython 发布:2024-11-28 22:49:54 浏览:211
服务器浏览量什么意思 发布:2024-11-28 22:49:09 浏览:965
可不可以同时安装几个编译器 发布:2024-11-28 22:34:08 浏览:935
苹果配置锁如何激活 发布:2024-11-28 22:10:24 浏览:669
linuxpython2与3共存 发布:2024-11-28 21:43:41 浏览:906