数据结构与算法

来源:互联网 发布:网络兼职在校学生 编辑:程序博客网 时间:2024/04/30 10:58

概念

  1. 数据结构:数据结构就是数据在计算机内存里或磁盘上的组织形式
  2. 算法:算法就是完成特定任务的过程,比如针对数据存储、查询、删除等一系列操作,为了使操作更具效率就有了各种复杂算法
  3. 有序数组可以使用二分查找
  4. 线性查找需要的时间与数组中数据项的个数成正比
  5. 二分查找需要的时间与数组中数据项的个数的对数成正比
  6. O1级时间的算法最好,Ologn次之,On为一般,On2最差

查找方法

  • 二分查找
    • 通过将数组数据项范围不断对半分割来查找特定的数据项,如下图中:一开始设置两个变量指向数组的第一个和最后一个非空数据项,通过这些变量可以确定查找SelectNum数据项的范围,然后在while循环中,当前的下标center被设置为这个范围的中间值;如果足够幸运center可能直接指向所查数据,所以应先查看是否相等,循环中的每一步将范围缩小一半,最终这个范围会小到无法再分割,在判断如果min比max大时,范围已经不存在了(没有找到数据项),两个变量的范围就如图二一样变化
      二分查找
      二分图

有序数组

  1. 优点:使用有序数组会给我们带来的主要好处是查找的速度比无序数组快多了
  2. 缺点:在插入操作中由于所有靠后的数据都需要移动以腾开空间,所以速度较慢。有序数组与无序数组的删除操作都很慢,还是因为数据的移动
  3. 使用条件:有序数组在查找频繁的情况下十分有用,但若是插入与删除较为频繁时,则无法高效工作。例如,有序数组适合于公司雇员的数据库(雇用与解雇不经常发生),另一方面,零售商店存货清单就不适合用有序数组(频繁的进货与出货操作)

简单排序

  1. 冒泡排序

    • 运行非常慢,最简单,算法思路:要将最小(大)的数据项放在数组的最开始(结尾)。外层for循环 i 从数组第一位开始,每经过一次循环加1。内层for循环 j 从数组第二位开始到数组长度与 i 差的范围,也就是说外层每循环一次内层就少循环一次,内层每次循环就有两个相邻数据项进行比较,将小(大)的向后面交换,当内层循环完时就会将最小(大)的值放在数组最后
      冒泡排序
      冒泡排序效率:当数组有N个数据时,公式为N(N-1)/2,可以认为冒泡排序运行需要On2时间级别,这种速度是很慢的
  2. 选择排序

    • 改进了冒泡排序,将交换次数从On2减少到On,不过比较次数还是为On2。算法思路:外层循环从数组开始至倒数第二个数据项,然后将每次循环下标记录在变量min里,内层循环是从外层循环数据项的右一位至数组最后数据项,在内层循环中依次将各个数据项与min的数据项进行比较,若是小于(大于)min就将min变量更新为该数据项下标,目的是选出最小(最大)的数据项,然后与外层循环下标的数据项进行交换,外层循环的下次循环时就不会再移动比较上次循环的数据项
      选择排序
      选择排序的效率:选择排序和冒泡排序执行相同次数的比较,然而交换次数大大减少,所以结论是选择排序与冒泡排序一样运行时间,但是选择排序更快
  3. 插入排序
    • 插入排序是基本排序算法中最好的一种,速度更快;算法思路:在for循环中从第二位开始至数组最后一位,在循环内将每次要循环的数据项保存在temp中,将下标保存在变量 j 中,在while里有两个条件,第一个条件是 j>0 为了确保在数组范围内;第二个条件是将temp依次与其左边的数据比较,若是小于(大于)就将 j 下标处数据项复制更新为其左边相邻的数据项(注意不是temp更新,而是数组的数据项更新),然后 j 自减,当while不成立后,再将 j (这时的 j 如果经过了while的循环数据随时在更新)下标处的数据项更新复制成temp
      插入排序
      插入排序的效率:复制的次数大致等于比较的次数。然而复制与交换的时间耗费不同,所以相对于随机数据,这个算法比冒泡排序快一倍,比选择排序略快。对于已经有序或基本有序的数据来说,插入排序要好得多,然而对于逆序排列的数据,每次比较和移动都会执行,所以插入排序不比冒泡排序快
  4. 简单排序的比较
    1. 一般情况很少使用冒泡排序,它过于简单,然而当数据量很小的时候它还是会有些应用的价值
    2. 选择排序虽然把交换次数降到了最低,但比较的次数仍然很大,当数据量很小并且交换数据相对于比较数据更加耗时的情况下,可以应用选择排序
    3. 在大多数情况下,假设当数据量比较小或基本有序时,插入排序是三种简单排序中最好的选择。对于更大数据量的排序来说,快速排序通常是最快的方法
    4. 这些排序算法都是假定了数组作为数据存储结构,且只需要一个临时变量

栈和队列

  1. 概念
    • 栈只允许访问一个数据项:即最后插入的数据项。移除这个数据项后才能访问倒数第二个插入的数据项,依此类推。栈是先进后出
  2. 例如:将输入的值倒着输出,在doR()方法中,input里面是用户输入的字符串,通过Stack1的构造方法创建一个对象,然后遍历字符串将字符用charAt一个一个的分离出来并用insert方法插入栈内,然后用pop方法输出在output字符串里,最后返回输出,利用了栈先进后出的原理,最后输出的字符串位置全部颠倒
    栈
    栈的效率:由上面程序可知,数据项的入栈和出栈时间都为常数O1,也就是说,栈操作所耗的时间不依赖于栈中数据项的个数,因此操作时间很短

未完,待续……

3 0
原创粉丝点击