什么是数据结构和算法?学算法还需要去了解数据结构吗?

问题描述:

什么是数据结构和算法?学算法还需要去了解数据结构吗?
我是这么理解的,数据结构就是数据在内存中的排列形式 比如可以是连续的 或者 分散的 或者是树型的等等方式排列的某一种结构.
算法就是在数据结构的基础上编出来的一种函数,就是说先有物理层的支持,然后才有的算法,那是不是说算法对应着数据结构,比如我要比较数的大小,我就调用一个比较算法的函数,然后这个函数就会在内存里以这个函数对应的数据结构方式排列?
如果我想要排序数字了,那这时候我要调用另一个排序的函数算法,这个算法就会在内存里把数按另一种数据结构方式排列?
那我感觉数据结构是相对应硬件方面来说的,毕竟在内存里排列,多少有点接近硬件了,那一般说学数据结构和算法 有什么用?
我感觉学算法还有点用,毕竟会了算法 就知道怎么实现功能了,那数据结构学了是不是就是能了解数据在内存里的表现形式这样多多少少便于了解下?还有别的用处吗?
比如说 数组也算是一种数据结构 那我把数组的函数算法学会了 不去学数组的数据结构或者说不想知道数据结构什么的 是不是也行?
1先看看我对数据结构和算法的理解对不对?
只学算法 不了解数据结构什么的
1个回答 分类:综合 2014-10-12

问题解答:

我来补答
你这理解不完全正确.      因为数据结构不只是内存中数据的排列,它是对数据的一种组织方式,就像图书馆要排书一样,是为了便于操作,同时它本身也集成了对通用操作:比如查找、比较等的支持.数组不是一种数据结构,而是一种数据类型.一个完整的数据结构包括逻辑结构和存储结构.通常选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素.     因此在语言实现上,数据结构通常也会包含与之相对应的算法集合,这些算法是指基本算法:查找、索引、比较等.
      数据结构的逻辑结构和硬件是没有关系的,而其存储结构受到计算机硬件系统工作方式的影响,通常这点影响在于数据时顺序存储还是离散存储.算法的基础是数据结构.只有指定明确的数据结构,算法才能设计完成,脱离数据结构,算法是无法,也不可能成立的.因为不需要数据的算法就不是一个有效的计算机算法,算法中任何对数据的组织形式都可以被称之为数据结构.
2.数据结构在编程中的地位是极其重要的,是一个程序实现的基础中的基础,在此基础上才能构建算法.通常而言,你不了解什么高深的算法,一样能完成工作,但是如果你不了解基本的数据结构,那么可以说,你根本就不能完成一个任何有实质性内容的程序.Donald Ervin Knuth教授在其《计算机程序设计艺术》的第一卷《基本算法》中花费的绝大部分的篇幅去论述数据结构.由此可见数据结构对算法的重要性.
再问: 排序 比较大小 删除 查找 等等这些是不是算法?如果是 那我调用这些函数功能不就行了 我知道它们是干嘛用的 能实现程序的功能不就行了?知道算法 是不是就等于知道数据结构了?那用什么编程语言能控制数据结构?是自己编写代码开发新的数据结构和对应的算法吗?
再答: 不一定,如果你知道某个算法的具体操作,你可以推测它的数据结构,但是不一定能完全确认。双向队列和栈在表现上就可能会存在完全一样的情形,但是不能只通过其操作比如push来确定到底是哪个数据结构。 不客气的说,大部分的数据结构都可以代替对方,但是他们之间的不同点在于其优化方式和编写不低不同,比如如果你要写一个二分查找的算法,用单向链式结构有够你恶心的…… 数据结构不同,与之关联的操作所采用的算法也就有不同的特点。就比如你要吃丸子可以用勺子也可以用叉子,当然用筷子也行,但是其难易程度不同,尤其在这丸子比蛋还滑的时候。 至于你判断是不是算法的话,可以自己去看算法的定义,当然我也可以告诉你是的。你知道查找是用来找到某个元素的,但是如果你不知道怎么查找不是一样是渣渣啊,在应用上,如果有现成的数据结构可以使用,你只要知道查找的接口就行了,连怎么查找,在哪里查找你都不用管,因为这些事情别人已经替你做了。 另外要强调一点,算法不是函数,算法有着严格的定义。通常我们在编程中所说的数据结构其实是抽象数据类型(ADT)即数据结构的实现模型,而不是数据真正意义上的结构。
再问: 那我感觉数据结构是在语法的基础上,人为开发出来的,和程序开发不同,虽然都是编程,但是前者注重的是某个算法的优化和创新,而程序的开发是这实现功能的时候调用别人的算法用。比如我用循环写出一个比较大写的算法,你用while循环也写出一个比较大小的算法,但是你的效率高,但是咱俩的数据结构都是一样的,只是你的算法比我好?那数据结构也是人为用编程语言开发出来的吗?
再答: 计算机上所有的东西都是人为开发出来的。数据结构本来是一个数学概念,那么我们拿到计算机里来用的话,肯定是要实现了的。一旦你的存储结构和逻辑结构固定了的话,那么怎样查找、删除等等操作都是固定了的。每种数据结构不是依靠数学计算产生的,而是依照实际需要产生的,从而对其附加了数学意义,然后再拿到计算机上来就是实现了的ADT了。我们就可以把他当做一个程序或者独立算法的实现使用。 一个算法采用的数据结构会影响算法的效率,但不一定是主要影响因素。基本算法和数据结构结合紧密,因而受到计算机硬件中存取方式的影响,其时间复杂度也要受到存取方式的影响。 但是应用算法是将数据结构当做一种基础设施使用,根据所处理的数据和算法本身特点选择合适的数据结构作为实现基础。 你为啥要钻牛角尖的要比较数据结构和算法啊,就比如你老想是把碗和吃饭相比,没有碗里的饭你吃饭的算法是不成立的,但是碗本身能盛着饭这个算法和你吃饭的具体过程有个毛线的关系啊。关心你所应该关心的,这是程序设计的基本出发点。程序就是一个个算法组成的,算法嵌套算法,直到最基本的步骤之前都可以被当成算法对待,但是这种分类不会让任何人幸福。 所以最终而言:你无法严格区分算法和数据结构之间那些重叠的部分,只是当你看问题的角度变化时,它们的关系也跟着变化。你比如说要在算法实现一个数据库查找的操作或者过程,那么你关系的是数据库是否为你完成工作以及完成的状况,而不关心它如何完成,至于数据库使用了什么算法和数据结构都和你无关。在这里数据库就是一种巨大的数据结构集合。 简单点说吧:编程上的数据结构包括数据物理存储和各种操作,是实现任何其他更复杂操作(算法)的基础。算法必须用到数据结构,无论是一个简单的数组或者什么的复杂数据类型(及其操作)来为你完成基本工作。这里有个小点需要注,数组不是一种编程意义上数据结构,但是用在算法中肯定会涉及对它的操作,相当于将顺序表这种数据结构进行了拆分,但其逻辑上仍然是一个顺序表。数组的意义是一种内置数据类型,当然有些语言也将数组(array)实现为了数据结构,通常是在一些面向对象语言中,比如java和c#。
再问: 这样,我们举个例子,就好理解了,我们用代码先编写一个数据结构比如是排序大小的东东,用的是for循环语法,这样一个简单的数据结构弄好了!那下面算法怎么弄,我就不知道了,你顺着我这个讲下去,比如先把数据结构封装,然后还是怎么算法调用这个数据结构功能等等,因为我老是从编程角度去想,所以不太理解,我是初学java的,循环 数组 集合 泛型 io 线程我都知道了,但是没见提到过数据结构和算法啊
再答: 谁说你没见过,array、arraylist呢,这货就是数据结构实现,强大的链表。 数据结构是有其定义的,常用的数据结构比如:线性表、树、图、二叉树、二叉平衡树、堆、队列、栈等。拿最简单的list来讲,分为顺序表和链表,前者的存储结构为数组一类的顺序存储,后者是使用指针或者引用的链式存储。在其上有查找、插入、删除等基本操作。这样我们任务这个数据结构是基本完整的。 再说排序算法:各种各样的算法你自己去查吧。简单的就拿直接插入排序来吧。要想插入到合适位置,如果是顺序表存储那么每次插入都要移动或者比较所有已排序的元素,因此其时间复杂度永远是最坏复杂度O(n^2),然而如果使用链表的话,其时间复杂度为O(n)~O(n^2)之间。这就是数据结构对算法的影响。
再问: 我靠 原来array arraylist 这些就是数据结构啊 原来如此 他们太不厚道了 直接说下这些是数据结构多好啊 上来就用这些类 什么的 我就以为是排列 查找 删除功能什么的 我哪知道这些叼玩意就是传说中的数据结构啊,小样的 它们换身皮我还真不认识了,那像arraylist这些其实可以理解为数据结构的类吗?因为java里有好多类,那应该也有数据结构的类吧?那我学了这些类就叫学数据结构了?
再答: java中很多数据结构的实现都内嵌到语言中了,这只是实现,可以当做学数据结构时的参考,学数据结构的主要目的是找明白在何处使用哪个数据结构能更有效、更简单。因此必须从ADT描述开始学起,你去买本数据结构java实现之类的看看,收获应该会很多的。 只是学习怎么使用已经实现的类的话,其实也行,不过有时候写程序会变的比较迷茫,因为数据结构背后都有足够的需求模型,如果你不了解,很难决断到底用什么才好。不过用熟练了也一样,对普通应用算是够了的。像学C++的很少有人知道STL模板库到底是怎么实现的那些数据结构。 一般而言,我们需要了解的就是数据结构的用途、特点、相关对算法影响的特性、最后要记住的是抽象模型。
再问: 就是说如果我看看那些数据结构的图 链表 树型什么的,可以更直观的理解这些数据是怎么排列的的结构,然后在配合实现的类,就能更好的知道什么情况用什么数据结构效果更好对吗?那算法在结构上有什么表示?是说咱俩数据结构都一样,实现同一种功能,你用循环,我不用循环,然后你效率比我高,这就叫不同算法?
再答: 第一个问题的答案是:对的,数据结构会影响算法的时空复杂度。 第二个问题:不,循环是一个语句,算法时间复杂度的衡量是根据基本操作的次数决定的,和循环不循环的无关,甚至和是否递归都无关。你可以找本算法教材看看,基本上第一章都会讲如何衡量算法的时空复杂度。
再问: 那比如你现在用arraylist的数据结构实现某个功能,现在数据结构有了,算法呢在哪?应该也是代码吧,不是说算法就是解题的步骤吗,你用2步就解开题,我用20步才解开题,这不就是算法的不同吗?时间复杂度不同 不就是这意思吗?要不你随便弄俩算法 那我区别区别啥叫算法
再答: 解决任何问题的任何一个有效的步骤的组合都可以称之为算法,但是在一般使用中,我们并不按照个这个定义执行对算法的界定,而是对一定的输入数据达成一定特定目标输出的过程称之为算法。所以一个算法要包含的元素包括:输入、处理、输出三个部分。也可以换句话说:获得数据、处理数据、把结果返回的过程就是算法。当然,现在在实际上算法的概念有些狭义:用来指定对某些问题的求解策略,这些问题通常来自于数学领域和计算科学领域。
再问: 那不严谨的说,我说的那个你用2步代码实现 我用20步代码实现的同一个功能,也多多少少是算法吧,就是狭隘的说的话?如果宏观的定义 就是你说的从开始到结束整个过程 输入 处理 输出整个的时间复杂度就是最科学的算法 是这样理解吧?
再答: 恩,大致上可以这么说。广义上来说算法就如百度百科上写的一样。实际上我们不常用算法指代我们解决问题的方法,而是叫做解决方案。算法这个词常用在专利和学术上。
 
 
展开全文阅读
剩余:2000
上一页:dc2inr3qec3r2
下一页:这样怎么写