Blue
Red
Green
Orange
Voilet
Slate
Dark

离散数学和数据结构在实际中的有多大应用? (50分)

L

lsj

Unregistered / Unconfirmed
GUEST, unregistred user!
这学期学了点离散数学和数据结构,觉得概念很有用
但算法在应用中却没用到,到底离散数学和数据结构在实际中的有多大应用?
我应不应该继续学下去?还是只理解概念就好?
请大家不吝指点!谢谢!

 

笑傲江湖

Unregistered / Unconfirmed
GUEST, unregistred user!
绝对有用,好好学吧:)
半路出家的程序员一不小心就会暴露出肤皮慅痒的弱点来.
 

房客

Unregistered / Unconfirmed
GUEST, unregistred user!
特别是数据结构
对PASCAL不了解地深入你答应吗?
我在补课 数据结构 呵呵
请指教
 
M

menxin

Unregistered / Unconfirmed
GUEST, unregistred user!
嘿嘿,妙用无穷!
建模和设计时能用得上
 

我爱飞

Unregistered / Unconfirmed
GUEST, unregistred user!
还能培养培养逻辑思维能力,还是好好学吧。
 
H

honestman

Unregistered / Unconfirmed
GUEST, unregistred user!
同意我爱飞的说法。
主要是能力的培养。
 
L

leegeing

Unregistered / Unconfirmed
GUEST, unregistred user!
数据结构是编写程序最基础的知识。
离散数学可以说是软件的一种抽象一种升华,
它能把一种表面复杂、毫无章法的系统,用一种
简洁抽象的方法描述出来,使你更容易看出里面的
规律精华。好好学吧!
 
B

baby_god

Unregistered / Unconfirmed
GUEST, unregistred user!
多学点没有坏处!
 

郭玉梁

Unregistered / Unconfirmed
GUEST, unregistred user!
杀人不见血的刀,要不断的实践-理论-实践-理论...,但也用不着拘泥,
我的朋友浙大研究生毕业一年了,离散数学有点烦,不过应当让实践需要指导你学习,
毕竟吾生也有涯!而知也有涯!
 

吕雪松

Unregistered / Unconfirmed
GUEST, unregistred user!
当你编程到一定时间,面对链表操作、复杂数据库结构和表关系、空间分析、矩阵操作等,
你就会把以前的书拿出来翻翻的。
 

赵普昉

Unregistered / Unconfirmed
GUEST, unregistred user!
没有什么有用没有用的说法,直到该用的时候就用不该用的时候就不用,现在还是因该认真的
去学,当你要用的时候就不会苦恼了,一句话"知识需要不同方面的积累,多多宜善".
 
C

Chenlili

Unregistered / Unconfirmed
GUEST, unregistred user!
用的时候,你就知道了,比如数据结构,当你在设计一个比较大的系统的
什么平衡算法,hash表。。。都用得上的
设计一个自己的文件系统也要,比如linux下的reiserfs文件系统,
就会涉及到二叉平衡树等东西。
 
S

starfish

Unregistered / Unconfirmed
GUEST, unregistred user!

以前也有许多人问我这个问题,下面是我以前答复别人的帖子:
==================================================================
计算机,顾名思义,是用来计算的机器,它本身并不具有思维能力,
将它叫做电脑实在是言过其实。无论多么复杂的程序,所从事的都是比较、
赋值、循环等基本的运算。我们要编程序解决实际问题,就是要将实际问
题的解题步骤用这些基本运算描述出来,这种描述就是算法。
如何才能将实际问题的解题步骤描述出来呢?这就要建立数学模型。
有些问题的数学模型非常明显,有些问题则比较含蓄。比如说,
岗哨设置问题(见以前贴出的贴子--第二个问题),这个问题可以
建立明显的数学模型,也就是图论模型。有了这个模型,就可以用
图论中的相关定理来解决此问题,计算机所起的作用不过是按照算
法计算结果。对于像走迷宫之类的问题,看上去没有明显的数学模
型,只能用回溯法搜索,但实际上这种搜索法本身就是一个数学模
型,这个模型叫做状态空间模型,即在某一个状态空间(状态的集
合)内,从某个初始状态开始,通过某种规则或运算,转移到目标
状态。如果状态A可以通过状态转移规则转移到状态B,则从A到B连
一条有向边,这样整个状态空间构成一个网络,只要找到从初始状
态到目标状态的路径即可,于是搜索法又转化为图论模型。也许对
有些问题建立严格的数学模型并不能简化问题的求解,但是可以通
过该模型将特殊的问题转化为一般的问题,至少具有理论分析(比
如复杂性分析)上的意义。
要建立数学模型,首先要将问题中的对象以及它们之间的相互关系
用数学语言描述,这就涉及到对象如何表示的问题,也就是采用什
么样的抽象数据类型(ADT)来描述对象。所采用的ADT应该能够方便
清晰地表现出对象之间的相互关系(包括显式的和隐式的)。然后
在ADT上定义一些运算(可以暂时不关心运算的实现),将问题的
解决步骤转化为ADT的运算的序列。至于ADT的运算,可以转化为更
小的子ADT运算来实现。转化到最后,分解到最小了,就必须考虑抽
象数据类型ADT如何存储在计算机的存储器中,即数据的描述方法。
最常见的数据描述方法有:公式化描述、链接描述、间接寻址和模
拟指针。
1。公式化描述借助数学公式来确定元素表中的每个元素分别存储
在何处 (存储器地址)。最简单的情形就是把所有元素依次连续存
储在一片连续的存储空间中,这时采用的公式是location(i)=location(1)+(i-1),
其中location(i)表示第i个元素的地址,并假设每个元素占用一
个内存单元。这也就是通常所说的连续线性表,即数组。
2。在链接描述中,元素表中的每个元素可以存储在存储器的不
同区域中,每个元素都包含一个指向下一个元素的指针(即内存中的地址)。
3。在间接寻址方式中,元素表中的每个元素也可以存储在存储器
的不同区域中,不同的是,此时必须保存一张表,该表的第i项指
向元素表中的第i个元素,所以这张表是一个用来存储元素地址的表。
4。模拟指针非常类似于链接描述,区别在于它用整数代替了指针,
整数所扮演的角色与指针所扮演的角色完全相同。如果所有模拟指
针分配的内存单元是一片连续的内存地址,则称其为游标描述或静态链表描述。
所有的基本ADT,比如说图、树、线性表等,最后都要用以上四种描
述方法中的一种或几种描述方法存储在存储器中。至于选择哪一种描
述方法,要根据ADT上定义的运算来确定,总的原则是使运算易于
实现并且占用的资源尽量少。对于某些复杂的ADT,比如堆、优先队列
等,则是用基本ADT来实现。因此ADT呈现出一种层次继承关系。我自
己整理了一些ADT的继承关系,将其列成表,可以在《算法与数据结构》
(http://algorithm.126.com/)网站上找到。
在构造算法的过程中还有一个难点,就是如何将解决问题的步骤用ADT的
运算描述。这个过程没有固定的方法,只能靠经验的积累和一时的灵感。
但是一般可以采取以下几个策略:递归策略,分治策略,贪心策略,动
态规划策略,搜索策略,随机策略,模拟策略等。这些算法设计策略只
是一种算法设计思想,并非固定的法则。必须分清楚各种策略的适用条
件和相互间的联系区别,在考虑问题时才能够正确地选择算法策略。
另外,熟悉常用抽象数据类型的各种实现方法和一些常用算法也很大帮助
。因为许多问题可以转化为类似的经典问题,或者可以分解为若干子问
题,而这些子问题可以用经典的算法和抽象数据类型解决。其中,最常用
的算法策略应该是搜索策略,几乎所有的问题都可以用此策略解决(但是
未必可行)。这种策略充分利用了计算机计算速度快的特性,在许多情
况下可以在合理的时间内找到问题的最优解。但是,对于有些问题,虽然
可以用搜索法解决,但是时间复杂性无法忍受,所以不可以滥用搜索法,
在使用搜索法之前要先估计时间复杂性。即使使用了搜索法,也要根据实
际情况进行优化,通常采用启发式搜索、A算法、A*算法或界限剪枝法,
目的是为了减少搜索的时间复杂性。还有一些看上去只能用搜索法或穷举
法的问题可以考虑用动态规划法和贪心法。值得注意的是,对于有些问题
,比如NP-完全问题,用任何算法都无法在多项式时间内解决,这时可以考
虑寻找近似解法,得到较优解或最优解的上下界,一般是采用贪心算法策
略构造近似解法。
以上是我的学习体会,下面说说我对学习算法和数据结构这门课的建议。
对于编程的初学者,可以先通过简单的排序算法了解最简单的ADT线性表的
常用操作;然后要重点掌握递归技术,包括递归和递推的相互转换。递归技
术非常重要,可以通过递归技术了解ADT栈的操作;接着学习搜索法的初步
--回溯法,研究经典问题八皇后问题和走迷宫问题,通过这些经典问题了
解深度优先搜索法(DFS)和广度优先搜索法(WFS)以及ADT栈、ADT队列的操
作,要学会利用人工设置堆栈模拟递归;接着可以学习分治法、贪心法这两
种常用的策略,并应用到排序、搜索等简单的算法中;这时再开始学习图和
树这两种抽象数据类型就应该没有什么难度了。在学习ADT图和ADT树时,要
注意结合离散数学中的图论理论知识和搜索法中的DFS,WFS方法,要学会将
实际问题转化为图论模型;再下去可以学习各种搜索法的优化算法,启发式
搜索、A算法、A*算法或界限剪枝法等;然后是网络流算法,要注意模型的
建立;最后学习最优化问题的解法,包括线性规划、动态规划、非线性规划
等算法策略,这部分内容主要侧重模型的建立和分析,算法本身并没有难度
。这样基本的算法就学习完了。再深入一点可以学习问题的计算复杂性,计
算模型,并行算法,神经网络以及各个领域中的具体算法。
=======================================================================
请到我的网站http://algorithm.126.com/看看,这是一个专门讨论算法与数据结构的网站,
在哪里你可以了解到算法与数据结构的重要性。
附:岗哨设置问题
有若干城市,某些城市之间有道路相连,现在要在道路上设置岗哨,
如果城市A,B之间的道路上有一个岗哨,则城市AB都可以被监视到。
现在的问题是,要求每个城市都被监视到,最少需要设置多少岗哨,
如何设置?
这个问题的模型对应有很多实际的问题,比如网络监听,路由设置等
领域里都要遇到这个问题。搜索是可行的,但是要加剪枝优化,否则
时间复杂度无法忍受。如果你的离散学的好的话,就知道这其实是一个
最小路径覆盖问题,可以转化为匹配问题,用匈牙利算法或网络流算法解
决。如果你对计算复杂性有研究的话,就会知道其实有一个简单的近似算法,
可以用每条边所连接的两个城市的度的倒数和作为权,每次选择权最小的边,
加上哨岗,然后将该边两端的城市及其相邻边删除,按这种方法做下去,直到
所有的城市都被删除。这是一种贪心策略,但是并不能保证求出的是最优解,
不过求出的是很好的近似解。
这么简单一道题,却要涉及多方面的知识,尤其是离散数学的知识。而这个问题又是
实际中常常遇到的。所以,编程能力要想提高,学好数学和算法与数据结构是关键。
各种开发工具就好像各门各派的武功招式,而算法和数据结构则使内功心法,内功提
高了,各种招式到了手上都能化腐朽为神奇。


 

黄耀彰

Unregistered / Unconfirmed
GUEST, unregistred user!
学会算法,提高逻辑思维能力。
 
L

lsj

Unregistered / Unconfirmed
GUEST, unregistred user!
谢谢大家!
特别感谢starfish!
 
顶部 底部