我是这么理解的,数据结构就是数据在内存中的排列形式 比如可以是连续的 或者 分散的 或者是树型的等等方式排列的某一种结构。
算法就是在数据结构的基础上编出来的一种函数,就是说先有物理层的支持,然后才有的算法,那是不是说算法对应着数据结构,比如我要比较数的大小,我就调用一个比较算法的函数,然后这个函数就会在内存里以这个函数对应的数据结构方式排列?
如果我想要排序数字了,那这时候我要调用另一个排序的函数算法,这个算法就会在内存里把数按另一种数据结构方式排列?
那我感觉数据结构是相对应硬件方面来说的,毕竟在内存里排列,多少有点接近硬件了,那一般说学数据结构和算法 有什么用?
我感觉学算法还有点用,毕竟会了算法 就知道怎么实现功能了,那数据结构学了是不是就是能了解数据在内存里的表现形式这样多多少少便于了解下?还有别的用处吗?
比如说 数组也算是一种数据结构 那我把数组的函数算法学会了 不去学数组的数据结构或者说不想知道数据结构什么的 是不是也行?
1先看看我对数据结构和算法的理解对不对?
2在告诉我 只学算法 不了解数据结构什么的 有影响吗?
你这理解不完全正确。
因为数据结构不只是内存中数据的排列,它是对数据的一种组织方式,就像图书馆要排书一样,是为了便于操作,同时它本身也集成了对通用操作:比如查找、比较等的支持。数组不是一种数据结构,而是一种数据类型。一个完整的数据结构包括逻辑结构和存储结构。通常选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。
因此在语言实现上,数据结构通常也会包含与之相对应的算法集合,这些算法是指基本算法:查找、索引、比较等。
数据结构的逻辑结构和硬件是没有关系的,而其存储结构受到计算机硬件系统工作方式的影响,通常这点影响在于数据时顺序存储还是离散存储。算法的基础是数据结构。只有指定明确的数据结构,算法才能设计完成,脱离数据结构,算法是无法,也不可能成立的。因为不需要数据的算法就不是一个有效的计算机算法,算法中任何对数据的组织形式都可以被称之为数据结构。
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步代码实现的同一个功能,也多多少少是算法吧,就是狭隘的说的话?如果宏观的定义 就是你说的从开始到结束整个过程 输入 处理 输出整个的时间复杂度就是最科学的算法 是这样理解吧?
追答恩,大致上可以这么说。广义上来说算法就如百度百科上写的一样。实际上我们不常用算法指代我们解决问题的方法,而是叫做解决方案。算法这个词常用在专利和学术上。
数据结构与算法密不可分。
数据结构注重了数据的组织形式。 数据的一定的组织方式已决定了只适用于某此算法。
算法寻求在指定数据结构上的最优解, 也就是最有效率的方法。 为此也有此设计特定的数据结构的, 比如红黑树就是被发明出来的。
好的算法: 存储空间效率(数据结构)与时间效率(算法性能)达到一定的平衡, 而非只突出时间效率。 所以一定要同时考虑这两个方面才能设计出一个好的算法。
应用中还要考虑特定的环境, 比如嵌入式, 没有大的内存, 这时有些占用大量的内存的一些算法就不适用了。
另一种角度: 借用C++中STL的概念,
数据结构: 在C++中定义为容器, 比如:vector(数组) list(链表)。。。而这些容器对于装入其中的东西并无限制, 比如使用者可定义装int, 也可以装char, 还可以装string数据。
算法: 在C++中定义也叫算法, 比如find, 查找指定的一个元素, 你可在vector容器中查找 , 也可用在list容器查找。 但是在不同的容器中查找效率是不同的, 这是容器本身决定的。
那请问我选择算法 是不是算法对应着数据结构?我控制了算法就等于控制数据结构?数据结构毕竟在内存里排列 我们不可能用手去摸对吧 那只能通过代码来控制 那代码就是函数算法 所以我认为算法就是控制数据结构的,那我学会算法 不就行了 至于数据结构在内存里怎么排列 我不了解不会有什么太大影响吧?比如我要存好多人信息 我知道有个数组的算法不就行了 至于数组让数据在内存里什么结构 我可以不了解啊
追答是的,这个是内存怎么存我们不管,但是我们这儿说数据结构的数据存诸方式不是说内存中是怎么样的方式。而且我们怎么把数据联系起来。因为计算机是傻的,他只知道存数据,你给什么他就存什么,他也不管顺序,还是什么的。我们的数据结构是把他们按照一定的逻辑规则来存诸。你说的内存是属于物理存诸,这个我也不懂,尽管我懂很多的数据结构。
数据结构不是计算机自己实现的,是人为设计的,就像上面的线段树,SPLAY树之类的,如果没有人为的设计,计算机中是不会自动产生这些东西的。你慢慢学一些算法之后就会对数据结构这一概念有更深刻的理解了。你现在对数据结构的理解还是有一些偏差。
那我明白了,数据结构是人为控制的,人让它怎么排列就怎么排列,但是人通过什么让它排列?肯定是机器语言啊那就是代码啊 那代码编好后就是函数啊 那大师们都帮我们把一些算法的函数搞好了 我们编程的时候只要学好这些算法的函数代码 然后调用不就OK了?除非你说学了数据结构以后,自己也可以开发出某个快捷算法?如果不学的话,那只能用大师们弄好的算法 是这样吗?
追答恩。可以这么理解。C++中有很多的STL就是封装好的数据结构。
追问请问数据结构是不是固定的,需要硬件支持?而算法可以不断创新,同一种数据结构,看谁的算法更快更节省空间?那我们自己只能创造算法 ,结构只能靠硬件来改变?就好比我写个代码算法,也不能表示就让数据在内存里怎么怎么排列了吧,那也太神奇了,那不是硬件控制排列吗?所以我感觉只能在数据结构固定支持的情况下,开发不同的算法。不知道是这样吗
追答数据结构是一种思想,软件和硬件都是可以实现的。这儿的结构说的是逻辑结构。和内存没什么关系。
你说详细点 我做过数组 斐波那契 水仙花 比较大小什么的题 这不就是练算法吗 也没见弄数据结构啊 有何不可?我把算法弄熟了不是一样吗 有什么不同吗 给我举个例子说下
我知道了 好像是如果会了数据结构 就可以自己创造一个新的快捷算法?如果不会结构 只能用别人写好的算法拿来用是吧?就像你说的 核心成员专门做出一些高效的算法函数出来,然后让员工们直接调用,如果没核心成员做算法 ,那大家只能用外国人做好的那些算法用 是这样吗?那也就是说同一种数据结构 可以有不同的算法 看谁的算法更好了?是不是说数据结构是固定的 根据硬件的支持才行?算法可以创新?
追答“好像是如果会了数据结构 就可以自己创造一个新的快捷算法?”通过数据结构的优化,可以创造新算法,比如你原来的数据结构里面1,2,3三个数字存放在同一个单元格内,然后我们的目标是选取1来乘以10得到一个新数字,旧的数据结构内,我们的算法第一步需要判断单元格内1的存在,第二步是筛选出1来,第三步是1乘以10。但如果我们来优化一下我们的数据结构,把1,2,3分拆在三个不同的单元格内,那么我们和10相乘,只要一步就可以完成,不用去从单元格三个数字去筛选判断出1来。
“那也就是说同一种数据结构 可以有不同的算法 看谁的算法更好了?是不是说数据结构是固定的 根据硬件的支持才行?算法可以创新?”这里面要更正一下,应该是说一个程序实现目标,可以有不同的数据结构和不同的算法,看谁的数据结构和算法更好。程序实现的目标是固定的,但数据结构和算法都是可以创新的。
比如我们现在进行一个目标命题:“大家用同样的积木建一个你心目中的建筑”,然后分给几个人同样多的积木,那么命题是固定的,但实现结果切会有很大的区别,大家会按照自己的理解进行搭建。
数据结构比算法重要是因为它是搭起来一个架子,比如建筑的时候的钢筋结构,你把架子框架搭好了,别人才能在此基础上进行后续工作。算法是具体的执行命令。
那我们用编程语言写的是数据结构,还是算法?还是说先编写出一个高效的数据结构代码,然后在再这个基础上,编写一个算法?这俩都是代码写出来的吗?那如何区分?比如你举个例子,你编写了一段代码是一种数据结构,然后呢,算法又是啥?然后别人要用你的数据结构,怎么用,是调你的算法还是怎么弄?
追答数据结构是一种逻辑思维,它有现成的已经是大家研究出来的各种结构方法,你可以利用它们进行组合。算法是编写出来的。
其实我以前也很迷茫,包括那个“面向对象”的概念,弄死弄不懂,后来慢慢的编程就理解了。数据结构你可以理解为数组排列,算法就是数组排列的里面数据的关联。
比如:1、3、5
2、4、6
这可以算是一个数据结构,他们横排的算法是“前数+2”,竖排的算法是“前数+1”。
别人用我的数据结构,不动算法的话他可以变成,算法仍然是“前数+2”,竖排的算法是“前数+1”。
5、7、9
6、8、10
如果是数据结构不变,算法改动可以为:
1、3、5
2、4、6
算法改动为:横排“前数+4-2”,竖排“前数+2-1”(我只是举例子,简单的算法这样看可能会感觉可笑,但如果你程序调用多了,其实很容易出现这样有笑话的设计。)
哦这样啊,那你都说了数据结构是别人弄好的,那我们还学有什么用?直接用不就可以了?还一个数据结构怎么控制的?是通过代码还是语法人为控制吗?比如你想让数组这么排列 它就这么排列了啊?那如果我在写个for循环之类的 是不是数据结构又变成另外一种了?算法我好像懂了,就是在确定了结构上,怎么加减之类的得到结果!但数据结构也是代码写出来的吗?那用的时候怎么选择它?
追答不学你怎么知道数据可以有多少种构成方法?每种构成方法在哪些情况下使用能达到最佳效果?你学习JAVA,它可以做网站也可以做游戏,我们比如你用它来做游戏设计,那么首先你要考虑的是什么?你首先要考虑的就是这个游戏会需要哪些数据、产生什么数据并且这些数据怎么进行交换运算,接着你就要根据这些数据的特点来设计它们的数据结构了,这个数据结构包括“数据定义”、“数据结构模型”和“数据存取位置”设计等;再接着就是设计算法了,让这些已有的数据如何运算产生新数据。你说的for循环这些都是运算语句,数据结构语句体现在“数据定义”和“数据存取位置”这些设计上,而“数据结构模型”是一种逻辑方式,比如你用图画一个“树型结构”或者“线性结构”这些都是一个数据结构模型,不一定要靠程序语言去实现,它代表的是一种宏观指导思想。
追问算法可以是通过代码写出来的,比如实现一个功能模块看你是用循环啊 还是数组啊 还是加法啊 减法啊 还是什么方法最后得到结果,这中间的过程内容就称为是算法 对吗?
那数据结构怎么看,也包含在代码里吗?你说的数据定义 存取 我怎么没看到啊 这玩意怎么控制的?我写过99乘法表 进制转换啥的 也没看见有啥数据结构啊 换句话说 数据结构看不见摸不到?都看不见的话怎么学习哦