1. 为什么要学数据结构和算法?
1.数据结构与算法
2.5大线性数据结构对比,源码解读
3.3类排序算法对比,理解排序
4.2类查找算法对比,理解查找
程序=数据结构+算法
数据结构是一个容器,用来存放数据,好的容器事半功倍,不同的数据结构有不同的特点,为了完成数据的存储和管理
算法就是为了如何去管理数据,如何去操作数据,更高效的查询
查询本质是找最短路径
大厂面试的必备内容
方便理解设计思想
写代码性能保障
锻炼思维逻辑,增加内功
2. 怎么学?
理解--写一遍--思考总结
不需要创造数据结构,理解,使用好数据结构
3.有哪些数据结构:
3.1 数组:array: 类型相同的连续存放容器,节约空间,查找块,增删满
多维数组:int[,] a=new [3,4]{{1,2,3,4},{5,6,7,8},{9,10,11,12}}
锯齿数组:int[2,3]
3.2 arrayList:动态数组,边长,里面的元素是object,有装箱,拆箱, ,默认长度为4,超过长度length *2 翻倍长度
trimToSize() 收缩空间,把开辟的多余的收缩掉,查找块,增删慢
runtime-main 源码
3.3 泛型list<string>:也是array,和arrayList基本一样,类型确定,不需要装箱拆箱,性能比arrayList好
3.4 sortedList,sortedList<int,str>,LinkedList<model>
3.5 堆stack(FILO),实际上是数组
stack<T>:先进后出,方便实现算法:回文 abba,abccba
3.6 队列queue:本质是数组,fifo
3.7 优先级队列:priorityQueue c#10新增的
权重队列:有性能损失
不同的数据结构,满足不同的需求
基类库BCL:https://github.com/dotnet/runtime 0415version
二,算法
10 大排查算法:冒泡,选择,插入排序
1. 冒泡算法:两两交换,比较,依次和后面的比较,直到大的靠右
选择排序:从第一个开始和后面的所有比较,将最小的放在第1个,依次循环,移动少,速度快
插入排序:从左开始,从小到大插入值
选择 》 冒泡 > 插入 的效率
2.查找算法:
顺序查找:forearch, 最大值,最小值
二叉查找:先排序在查询,判断索引(length-1 + i )/2的值和查找的值的是否相等,能提升性能
3. 自组织查找算法: 热数据:将每次查找的数据向前移动一位(除第1位),二 八原则:将每次查找的数据向前移动一位(除前面的20%不移动,后面的80%移动)
二叉查找:
public static int show(int[] arr,int value)
{
int right=arr.lenght -1;
int left=0;
int middle;
while(left < right)
{
middle =(left + right)/2;
if(arr[middle]==value)
{
return middle;
}
else if (value <arr[middle])
{
right =middle -1;
}
else{
left=middle +1;
}
}
return -1;
}
递归二叉查找:性能不好,空间乱费
public static int bshow(this int[] arr,int value,int left,int right)
{
if(left >right)
{
return -1;
}
int middle=(int)(right+left)/2;
if(value < arr[middle])
{
return arr.bshow(value,left,middle -1);
}
else if(value ==arr[middle])
{
return middle;
}
else
{
return arr.bshow(value,middle+1,right);
}
}
屏幕录像专家2020
1.各种链表结构学习,对比数组差异
2.各种二叉树结构,理解线性存储,非线性存储
3.hash存储 存取都快,是如何实现的
4.数据结构总结,从内存角度理解数据结构
链表:linkedList,数据随机存放,不是连续存放,增加删除简单,访问慢
线性结构分:数组和链表(栈和队列),元素的前后只有一个元素
非线性结构:元素的前后可能有多个,多维数组,树,图