20162317 2017-2018-1 《程序设计与数据结构》第3周学习总结

20162317 2017-2018-1 《程序设计与数据结构》第3周学习总结

教材学习内容总结

一、查找

1、两大方法:
(1)线性查找:逐个进行比较,最后找到需要的那个。
 时间复杂度:O(n)
(2)二分查找:在一个有序的序列中,将序列分成两半,在两个可行候选者之间找到适合的,然后再次进行二分。比起线性查找它的工作每次少了一半
时间复杂度:O(logn)
2、查找的相关知识点
(1)查找池

二、排序

1、方法
(1)选择排序:先扫描整个数组,找最小值,然后与第一位交换。然后再次扫描整个数组,找到次小的值,将这个数和数组第二位交换,如此类推,一直做到整个数组有序
平均时间复杂度:O(n2)
(2)插入排序:每次按顺序从序列中抽取一个数,并将这个数放在序列中正确的位置。
平均时间复杂度:O(n2)
(2)冒泡排序:序列中相邻的两个数进行比较,若为逆序,则进行交换,并重复进行这一系列的操作,最终得到正序的序列。
平均时间复杂度:O(n2)
(3)希尔排序:按照一定的间隔将序列分成若干小组,对这若干小组进行排序。组成新序列,再进行分组、排序,经过若干次后最终得到一个有序的序列
平均时间复杂度:O(nlogn)
(4)快速排序:选择一个数作为枢轴(一般来说选择第一个为枢轴),然后和其中一个数来比(一般按顺序来)若枢轴大于被比较的那个数,则换位置直到两边分别为均小于枢轴和均大于枢轴。然后分成两边再找枢轴,如此类推直到最后整个序列为一个有序的序列。
平均时间复杂度:O(nlogn)
(5)归并排序:将每个序列拆开,然后两两组合,将逆序的组进行调换,然后再两两组合、排序,最后得到一个有序的序列
平均时间复杂度:O(nlogn)

教材学习中的问题和解决过程

  • 问题1:我看到插入排序的定义是这个:“每次从数列中取一个还没有取出过的数,并按照大小关系插入到已经取出的数中使得已经取出的数仍然有序。”但我当时不大理解究竟是怎么回事
  • 问题1解决方案:在经过同学的耐心解释以及加上例子的理解,我对插入排序的认识可以这么解释:一个无序序列,一个个数地抽取,抽出来的数放在合适的位置,最后组成一个有序的序列

代码调试中的问题和解决过程

  • 问题1:在程序13.1和程序13.2中我未能够明白为什么在target中要输入lastname和firstname才能够进行查找,缺少一个都会返回未能找到。
  • 问题1解决方案:经过和同学的探讨和调试之后,发现程序13.2中的查找方法被强制转型为程序13.1类,因此程序13.2元素之间的比较实际上是用的是程序13.1的比较。而程序13.1的中明确了先比较firstname,若不一样就回去去比较lastname,因此需要firstname和lastname两个参数。因此在程序13.2中要放入两个参数。

代码托管

上周考试错题总结

  • void fun3(int n)
    { int i=0,s=0;
    while (s<=n)
    { i++;
    s=s+i;
    }
    }

求上面算法的时间复杂度

我的答案:O(n)
正确答案:O(n^(1/2))
原因:循环的条件是:s<=n。s的增长为s=0+1+2+3+4+...+T(n)。可以简化为:(T(n)(T(n)+1))/2 = s, 即(T(n)(T(n)+1))/2 <= n n。T(n)^2+T(n) <= 2n。将低次项和 常数去掉 T(n) <= O(n^(1/2))

结对及互评

点评模板:

  • 博客中值得学习的或问题:
    • markdown语法正确,格式清晰。
    • 问题思考得比较深入

其他(感悟、思考等,可选)

这周有点懒,也觉得挺对不住自己,因此从现在这一刻起收拾好心情,专心学习。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 20/220 1/3 20/40
第三周 645/865 1/4 14/564
posted @ 2017-09-24 07:08  FunnyOne  阅读(232)  评论(2编辑  收藏  举报