数据结构与算法入门

来源:互联网 发布:试卷出题软件 编辑:程序博客网 时间:2024/05/16 09:57

任何高大上的技术都需要踏踏实实的基础:算法+数据结构+编译原理+操作系统

白板编程

To summarize: We have seen that computer programming is an art, because it applies accumulated knowledge to the world, because it requires skill and ingenuity, and especially because it produces objects of beauty.

搜索引擎:搜索算法+排序算法
算法的力量:性能优化

计算机科学有两类根本问题。一类是理论:算法,数据结构,复杂度,机器学习,模式识别,等等等。一类是系统:操作系统,网络系统,分布式系统,存储系统,游戏引擎,等等等等。理论走的是深度,是在追问在给定的计算能力约束下如何把一个问题解决得更快更好。而系统走的是广度,是在追问对于一个现实的需求如何在众多的技术中设计出最多快好省的技术组合。

  • 谷歌搜索,0.67s得到结果,上亿的数据;
  • 苹果siri:语音识别,理解人类语言并智能回应;
  • 推荐算法:机器学习;
  • 动画的渲染,运动效果,图形学
  • 游戏,迷宫的生成,扫雷:洪水填充(Flood fill)算法
  • 无人机,计算机视觉,识别图像信息
    这里写图片描述
    这里写图片描述
  • 线性排序-树形结构-图形结构
  • 数据结构很重要
  • 斐波那契堆,线段树,网络流

这里写图片描述
这里写图片描述

To summarize: We have seen that computer programming is an art, because it applies accumulated knowledge to the world, because it requires skill and ingenuity, and especially because it produces objects of beauty.

选择排序(Selection Sort)
简单,但是对于任何数组,选择排序两层循环必须完全完成。

插入排序(Insertion Sort)

 image

image

image

image

image

对于插入循环来说,,提前终止内层循环是一个很重要的性质 。 对于越有序的数组进行排序,时间复杂度会从O(N^2)向O(N)无限接近

冒泡排序(Bubble Sort)

Bubble Sort (没有插入性能好)

var n = [28,34,54,43];for(var j = 0 ; j < n.length - 1;j++){    for(var i = 0;i < n.length- 1 - j;i++){        if(n[i]>n[i+1]){            var temp = n[i];            n[i] = n[i+1];            n[i+1] = temp;            }        }        console.log(n);    }

插入排序升级,希尔排序(Shell Sort)n二分之三次方

 

2017-05-14_085225

 

Merge Sort 归并排序(本质:递归)

2017-05-14_085833

把数组分成一半,左边的进行排序(分成一半……),右边的进行排序(分成一半……),

最后,会分到一定的程度,每一部分只有一个元素(本身就是有序的)。

然后归并.

2017-05-14_085935

2017-05-14_090014

2017-05-14_090043

二分法,一层层分级,分为3级,8/2=4/2=2/2=1,log(N)层级,

如果归并过程以O(n)的复杂度来解决的话,那么N log(N)

2017-05-14_090200

解决问题:以O(n)的算法来归并,形成新的有序的数组

2017-05-14_090958

2017-05-14_091121

思路:开辟同样大小的临时空间,不过有利有弊,算法的速度提升了,但是需要的内存空间增加了。(在计算机,时间的效率比空间的效率重要的多)

使用三个索引在内存上追踪

蓝色:表示归并过程中最终需要归并的位置

红1,红2:分别指向两个已经排好序的数组

2017-05-14_091931

比较1和2哪个小,先进入归并数组,1进入,然后蓝箭头位移一位,比较2和4

2017-05-14_092159

2017-05-14_092255

2017-05-14_092336

2017-05-14_092422

k表示ij比较后下一个需要放置的位置(在程序中始终满足变量的定义是程序的基础

l(left) r(right)前闭后闭的空间,

2017-05-14_093354

 

 

快速排序(Quick Sort) 20世纪最伟大的算法之一

 

2017-05-14_164932

以一个元素为基点,然后移动到其大于之前元素的位置上。(核心:Partitions

如果e>v,直接融入v,如果e<v,j+1位置元素和e互换位置,然后j++(橙色块增加),I++(紫块增加)

2017-05-14_165659

当我们遍历完后,再进行l和j互换位置,最终:

2017-05-14_170659

退化至O(n^2)的算法,当两端极端不平衡

这里写图片描述

升级

这里写图片描述

这里写图片描述

堆排序(Heap Sort)

优先队列(Priority Queue)

2017-05-14_200313

比如:操作系统把CPU的执行周期划成时间片(一个时间片只能执行一个任务),每个任务都有一个优先级。所以,需要动态选择优先级最高的任务执行

2017-05-14_201112

优先队列主要操作:入队,出队(取出优先级最高的元素)

2017-05-14_201354

2017-05-14_201500

二叉堆(Binary Heap)

2017-05-14_202039

因为完全二叉树的特性(左边的子节点是父节点的二倍),所以我们可以使用数组来存储二叉堆

2017-05-14_202540

从堆中添加元素(Shift Up)

新添加元素依次和父元素比较,如果比父元素大则交换位置

2017-05-14_204040

2017-05-14_204118

2017-05-14_204206

从堆中取出元素(Shift Down)

image

最后一个元素和取出元素替换,count–

image

最后一个元素依次和左右两个子元素比较(取最大值替换),逐层比较,直到终止

image

Heapify

image

叶子节点的父节点和两个叶子对比,然后最大的成为父节点,向上一层一层的比较

image

QQ截图20170515174227

image

 

Selection Sort(从小到大):

image

1.:在选择范围选择出最小的元素,然后和第一位互换位置

2.:在剩下的位置中找出最小的元素

image

image

image

依此类推

image

只能计算int型

#include <iostream>  #include <algorithm>  #include <string>  using namespace std;  void selectionSort(int arr[], int n){      for(int i = 0 ; i < n ; i ++){          // 寻找[i, n)区间里的最小值          int minIndex = i;          for( int j = i + 1 ; j < n ; j ++ )              if( arr[j] < arr[minIndex] )                  minIndex = j;           //交换位置           swap( arr[i] , arr[minIndex] );      }  }  int main() {      int a[10] = {10,9,8,7,6,5,4,3,2,1};      selectionSort(a,10);      for( int i = 0 ; i < 10 ; i ++ )      cout<<arr[i]<<" ";      cout<<endl;      return 0;  
####升级:浮点数,字符串,自定义(利用模板来解决)
#include <iostream>  #include "Student.h"  using namespace std;  template<typename T>  void selectionSort(T arr[], int n){      for(int i = 0 ; i < n ; i ++){          int minIndex = i;          for( int j = i + 1 ; j < n ; j ++ )              if( arr[j] < arr[minIndex] )                  minIndex = j;          swap( arr[i] , arr[minIndex] );      }  }  int main() {      // 测试模板函数,传入整型数组      int a[10] = {10,9,8,7,6,5,4,3,2,1};      selectionSort( a , 10 );      for( int i = 0 ; i < 10 ; i ++ )          cout<<a[i]<<" ";      cout<<endl;      // 测试模板函数,传入浮点数数组      float b[4] = {4.4,3.3,2.2,1.1};      selectionSort(b,4);      for( int i = 0 ; i < 4 ; i ++ )          cout<<b[i]<<" ";      cout<<endl;      // 测试模板函数,传入字符串数组      string c[4] = {"D","C","B","A"};      selectionSort(c,4);      for( int i = 0 ; i < 4 ; i ++ )          cout<<c[i]<<" ";      cout<<endl;      // 测试模板函数,传入自定义结构体Student数组      Student d[4] = { {"D",90} , {"C",100} , {"B",95} , {"A",95} };      selectionSort(d,4);      for( int i = 0 ; i < 4 ; i ++ )          cout<<d[i];      cout<<endl;      return 0;  }  

运算符进行重载:C++预定义中的运算符的操作对象只局限于基本的内置数据类型,但是对于我们自定义的类型(类)是没有办法操作的。

运算符重载的实质就是函数重载或函数多态。运算符重载是一种形式的C++多态。目的在于让人能够用同名的函数来完成不同的基本操作。

运算符重载为类的成员函数的一般语法形式为: 
函数类型 operator 运算符(形参表)
 

  
函数体;
 

运算符重载为类的友元函数的一般语法形式为:
 
friend 
函数类型 operator 运算符(形参表)
 

  
函数体;
 

//解决.h文件的多重引用问题,.h文件不对外隐藏  #ifndef INC_02_SELECTION_SORT_USING_TEMPLATE_STUDENT_H  #define INC_02_SELECTION_SORT_USING_TEMPLATE_STUDENT_H  #include <iostream>  #include <string>  //容易出现命名空间污染的问题  using namespace std;  struct Student{      string name;      int score;      //运算符重载      bool operator<(const Student& otherStudent){          return score != otherStudent.score ?                 score > otherStudent.score : name < otherStudent.name;      }      friend ostream& operator<<(ostream &os, const Student &student){          os<<"Student: "<<student.name<<" "<<student.score<<endl;          return os;      }  };  #endif //INC_02_SELECTION_SORT_USING_TEMPLATE_STUDENT_H  
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 卡丢了不知道卡号怎么办 驾考网上预约用户被锁定了怎么办 人才中心拿出来的户口掉了怎么办 父母是南京集体户孩子没户口怎么办 二建挂靠中介单位不给证怎么办 小包工头遇到工人在工地摔伤怎么办 外地人买了城中村的房子改造怎么办 深圳社保怀孕了产检异地怎么办 成都公租房租满6年怎么办 二建审核资料如果照片丢失怎么办 身份证被冒用在外地办社保怎么办 蔷薇的嫩叶都被太阳晒死了怎么办 乐视手机进水了屏幕失灵怎么办 乐视手机进水了屏幕不显示怎么办 美团商家单量出现下滑怎么办 想开个小超市没经营过怎么办 华为7c手机wifi信号差怎么办 贞子从电视里爬出来怎么办 2个月的婴儿吓到怎么办 排卵日同房了没避孕怕怀孕怎么办 妻子因为我欺骗她要跟我离婚怎么办 老婆用苹果手机共享我的位置怎么办 孕妇餐后2小时血糖偏高怎么办 孕妇血糖餐后2小时数值高怎么办 股市退市的话股民的钱怎么办 美股股票退市了手里的股票怎么办 坐高铁安检时怕把包包弄坏了怎么办 很贵的包包高铁安检怎么办 如果过高铁安检东西被扣留怎么办 邻居家小孩把我家东西弄坏了怎么办 邻居早上6点放音乐扰民怎么办 隔壁楼邻居天天放音乐很吵怎么办 发现老公在卧室安了摄像头怎么办 憋的尿又没有厕所的时候怎么办 一岁宝宝拉屎总是拉出血怎么办 孩子鼻窦炎鼻子堵有白色鼻涕怎么办 家里阳台上老是有蝙蝠趴着怎么办 空调太冷在空调房里该怎么办 分手了怎么办不要挽回要重新吸引 过敏体质没打疫苗的孩子入学怎么办 遇到不认识的小姐姐问我问题怎么办