Hri*_*sto 39 c++ data-structures
所以我是一名计算机科学专业的学生,大约一个星期左右......我将重新学习数据结构课程,使用C++来应用该理论.是的,我确实说过"重拍".去年秋天我参加了课程,我觉得还有更多需要学习的东西.作为一名学生,我觉得我必须了解基础知识,因为通过已经了解基本概念来了解未来课程中的新概念会更容易......不必每次都重新学习.
第一次,我没有C++经验,课程期望我们在第一周结束时编写代码.我努力完成了几个最初的编程任务(MP).毋庸置疑,我已经习惯了,并且在学期的剩余时间里对语法没有什么困难.但随后更难的数据结构出现了,理论(Big O)成为了困难的部分.
总而言之,这是一次很棒的经历,但我觉得我的问题是我没有养成良好的学习习惯.我做了国会议员并出席了演讲,但似乎我心里不在乎.我想第二次改变这个,因为回顾课程,我确实度过了愉快的时光,我很喜欢这些材料.但是当我需要花时间思考如何有效地使用数据结构时,我发现自己花了太多时间考虑/设置数据结构.
学习理论很难(主要是因为它不那么令人兴奋)所以我应该如何应用自己来真正理解数据结构所涵盖的类?我一直是一个视觉学习者,一个互动的学习者......我不想花时间做我的议员.相反,我想花时间以这种方式让我真正学习/理解概念,然后直接应用知识.
我正在寻找任何建议......或许有关于过去学习这些概念的学习习惯的建议......或者关于良好笔记技巧的建议......你想分享的任何事情:) ......最重要的是,如何在学期开始前做好准备.
即使选择了答案,也请随时提供反馈.我正在寻找你的建议...这就是我发布的原因:)谢谢!
注意:课程中涵盖的数据结构和主题:列表,堆栈,队列,树(不同种类),哈希表,图形,搜索/排序/遍历技术.
更新:这是目前为止从答案中编译的链接和参考列表.
更新2:这是我发现的更多来源的列表:
Sim*_*mon 21
您已经收到了一些有趣的链接和想法.我希望我能提供一些不同的观点:
通过教导计算机内存就像一个很长的列表,我学会了可视化和"喜欢"数据结构.然后,结构在存储器中具有不同的布局.通过可视化记忆中的结构,我(以及有趣的)它们如何工作变得显而易见.了解内存中的数据布局对于程序员来说非常重要,因为今天不断增长的机器通常会被内存访问所阻止.良好的内存布局减轻了CPU从内存中获取数据的负担,因此CPU不必等待数据到达.
数据结构是存储器中数据的布局.将内存视为一个长列表,就像购物清单但没有条目.
0...
1...
2...
3...
4...
5...
6...
Run Code Online (Sandbox Code Playgroud)
当你将结构放入内存时,它们基本上会填充内存中的这些插槽.
列表非常简单,它只是从顶部和底部填充内存列表:
0 Element 0
1 Element 1
2 Element 2
3 Element 3
Run Code Online (Sandbox Code Playgroud)
虽然有时您想要将元素2更改为其他内容,但可能为零.这就是列表工作的方式.您可以通过了解其索引来访问结构中的数据(在本例中为0 .. 3).
堆栈是不同的.您只能通过将元素"推"到其顶部来访问堆栈的"顶部",或者从其顶部"弹出"元素.推动意味着添加另一个元素,旧的顶部变得不可见.弹出意味着移除顶部元素,其下方的元素变得可见.
0 [ Hidden data ]
. [ Hidden data ]
. [ Hidden data ]
. [ Hidden data ]
n [ Hidden data ]
n+1 Element 4
Run Code Online (Sandbox Code Playgroud)
链接列表是不同的.链表包含数据的指针(内存列表中的索引)和指向下一个元素的指针:
0 Data: Memory index 0x00000100
1 Next: Memory index 6
2
3
4
5
6 Data: Memory index 104
7 Next: Memory index 8
...
100 Data pointed to from first member
101
102
103
104 Data pointed to from second member
Run Code Online (Sandbox Code Playgroud)
队列就像一个更强大的堆栈,你可以访问底部和顶部.您只能将项目推到顶部,而您只能从底部弹出项目.
0 (bottom) Element (ready to be popped)
1 [ Hidden data ]
2 [ Hidden data ]
3 [ Hidden data ]
.
.
.
n (top) (empty, ready to be pushed / be given data)
Run Code Online (Sandbox Code Playgroud)
通过可视化每个数据结构的布局,对于我们如何需要内存以及它们如何工作(也在内存中),它们变得更加明显.我希望我的例子能为您提供一些简短的入门知识,为您的未来研究奠定基础.作为数据结构的最后一个例子,我将给你一个不平衡的二叉树,它具有以下元素插入顺序:3,2,1,10,9,8,6,5,4,7
树从内存地址100开始,因为内存地址0无效,我将其用作"无指针".
100 Value: "3"
101 Left ptr: 103
102 Right ptr: 109
103 Value: "2"
104 Left ptr: 106
105 Right ptr: 0
106 Value: "1"
107 Left ptr: 0
108 Right ptr: 0
109 Value: "10"
110 Left ptr: 112
111 Right ptr: 0
112 Value: "9"
113 Left ptr: 115
114 Right ptr: 0
115 Value: "8"
116 Left ptr: 118
117 Right ptr: 0
118 Value: "6"
119 Left ptr: 121
120 Right ptr: 127
121 Value: "5"
122 Left ptr: 124
123 Right ptr: 0
124 Value: "4"
125 Left ptr: 0
126 Right ptr: 0
127 Value: "7"
128 Left ptr: 0
129 Right ptr: 0
Run Code Online (Sandbox Code Playgroud)
希望有所帮助!
dan*_*yim 17
这是最有帮助的...因为你是一个视觉人,谷歌有一些可视化的排序算法,树遍历,散列等等,以便大致了解正在发生的事情.在那之后,尝试使用不同的结构制作一个简单的程序,并尝试不同的排列 - 例如,你可以创建一个链表开始,然后使它成为一个循环链表,然后使其成为一个双向链表,然后把它变成一个双循环链表,依此类推......
您只需要试验结构,当您这样做时,您将开始看到哪些数据结构适合您将要开发的应用程序.
以下是一些很好的参考资料.排序算法:http://www.sorting-algorithms.com/树遍历:http://nova.umuc.edu/~jarc/idsv/lesson1.html图形遍历:http: //www.cosc.canterbury.ac.nz/mukundan/dsal/GraphAppl.html
至于效率(大O分析),一旦你理解了数据结构的每个操作的算法级别发生的事情,它或多或少会自然而然地产生.
我的大学强调的一件事是开发我们自己的数据结构实现(这是自下而上的学习),而不是潜入预先建立的C++模板(自上而下的学习).通过从头开始,您真正了解插入,删除,搜索(遍历)和访问某个结构中的数据所涉及的开销,这将有助于您在将来设计系统时的直觉.
实践,实践,实践.
我给你的第一条建议是尽可能熟练地使用C++.
数据结构和编程是两个非常不同的主题.如果您发现自己在编程方面苦苦挣扎,那么您就不可能理解数据结构.
你如何熟练掌握C++?实践,实践,实践.编程一切.了解有关它的一切.写几十个小程序.你可以做些什么来适应C++.
如果您熟练掌握C++,那么我向您保证数据结构将变得更加容易.(注意我没说简单,我说更容易:))
学习数据结构的关键是从一些小的东西开始,然后在此基础上进行构建.让我们从一个简单的C
结构开始:
struct Person {
char name[100];
int age;
};
Run Code Online (Sandbox Code Playgroud)
该数据结构代表一个人.你需要确保你理解这些简单的结构概念,然后你可以转向更大的东西.
例如,当您开始讨论堆栈和队列等数据结构时,首先尝试从概念上理解数据结构正在做什么.例如,对于堆栈,我们使用LIFO原则,即Last In First Out.使用队列,我们使用FIFO原则(先进先出).
然后是那个让很多人绊倒的链接列表.你需要很好地理解这个指针,所以在尝试处理链表之前,先从简单的事情开始:
int* x;
int y = 10;
x = &y;
Run Code Online (Sandbox Code Playgroud)
您应该能够查看该代码并立即知道它正在做什么.如果你做不到,那么你还没准备好转向更高级的数据结构,比如链表.
我要做的主要观点是你需要将基础知识降低,然后再建立基础.同样非常重要的是要非常努力地跟上课程,如果你遇到麻烦,请问你的老师或导师,并确保你每周都走上正轨并且不落后.
计算机科学课程很像数学课程,每周通常建立在你从前N周学到的所有东西上.因此,如果你不理解一个关键概念,例如指针,那么你将在本学期的剩余时间内进行重大的斗争.
我喜欢dcp的回答.
围绕数据结构的最佳方法是编写迷你示例.即使你从书中复制它们,如果你可以让它们工作和编译,并且你用自己的手指输入它们,你将会学到很多东西.
当您阅读您的书时,在每次讲座之后,编写您可以创建和使用(显示,使用等)您刚学到的数据结构的最短程序.
然后当你必须完成实际的作业时,你会学到更多的东西,当你尝试拿出你的迷你例子并将它们插入解决分配问题时.
我认为为单个数据结构编写最短/最小的工作代码非常有用.此外,不要害怕复制代码(为了你自己的启发,而不是你的转身分配)....如果你通过打字复制而不是复制粘贴,你最终学习了很多,因为它迫使你查看代码中的每个字符.
如果整个数据结构看起来"太多"无法绕开,那么首先编写数据结构组件的迷你示例.所以用指针存储书名.然后存储许多带有指针指针的书名.使用方括号表示法和指针算法读取书名.在简单的函数中使用递归,其中显示正在发生的事情.....例如,递归以显示数字的阶乘更简单地包围你而不是递归以显示二叉树(在我看来)... ..
你会看到你的问题区域是什么,并尝试将它们分离为尽可能小的特定事物,然后写一个可以处理该问题区域的程序.....然后建立.
你的讲座是关于整个数据结构的......巨大的Cummulus云理论库......所以,基本上他们是自上而下的.在小问题中隔离语法和用法的小问题是自下而上的.因此,你的老师会帮助你从顶部进行攻击,你可以通过练习从底部进行攻击,很快中间就没有任何东西了!