数据、数据元素、数据项、数据对象
物理结构:顺序、链式存储
逻辑结构:集合结构、线性结构、树形结构、图形结构
算法的特性:输入、输出、有穷性、确定性、可行性
注:时间复杂度——算法所花费时间;空间复杂度——算法运行所占内存的大小;稳定性——相等的两个数a与b,排序前a在b前面,若排序后位置不变则稳定,反之则不稳定;内排序——排序在内存中完成;外排序——数据量大,排序要通过内存和磁盘; 我们常说的算法是内部排序算法(插入、选择、交换、归并),排序算法分为比较排序、非比较排序(基数、计数、桶排序)
1.1 最快的排序算法是哪个
数据规模较小:直接插入排序(序列基本有序);简单选择排序(不稳定),对稳定性有要求宜用插入或冒泡(稳定);
数据规模较大:快速排序(序列无序,不稳定);归并排序(序列无序,稳定,内存大);
数据规模巨大:归并排序(稳定)或堆排序(不稳定)
1.2常见排序算法的过程及详细代码(8大)
冒泡排序:对于给定的n个记录,两两比较相邻记录的关键字,若反序则交换,直到没有反序记录为止。
简单选择排序:通过n-i次关键字比较间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录交换。
直接插入排序:将一个记录插入到已排好序的有序表中,得到一个新的、记录数增1的有序表。假设第一个记录自成一个有序序列,按记录大小依次插入,直至最后一个记录插入有序序列为止。
快速排序:给定一组记录,通过一趟排序,将待排序记录分割为独立两部分,其中一部分记录的关键字均比另一部分记录的关键字小,分别对这两部分记录进行排序,直到整个序列有序。(通常取第一个元素作为枢轴分为两部分,左边比它小,右边比它大)
希尔排序:缩小增量排序,将原纪录(有大量记录数)进行分组,分割为若干子序列,使每个子序列待排序列的记录个数相对较少(相距某个增量的记录组成一个子序列),对各个子序列分别进行直接插入排序,当整个序列基本有序时,再对全体记录进行一次直接插入排序。(在直接插入排序的基础上加增量序列)
归并排序:原理是假设初始序列含有n个序列,可以看成是n个有序的子序列,将每相两个邻的长度为1的子序列进行归并,得到n/2(向上取整)个长度为2或1的有序序列,再将其两两归并,如此重复,知道得到一个有序序列为止。
堆排序:完全二叉树,最大堆和最小堆。假设利用大顶堆,序列的最大值就是堆的根节点,将其与堆数组的末尾元素交换,末尾元素就是最大值,然后将剩余n-1个序列重新调整为一个堆,得到次大值。如此反复执行,得到一个有序序列。两个过程:建堆,调整堆;
折半查找(二分查找时间复杂度:log2n,线性表有序):
顺序查找、索引顺序(分块)、二叉树查找、哈希查找
基础知识(性质):
二叉树第i层上的结点数目最多为 2(i-1) (i≥1);深度为k的二叉树至多有2k-1个结点;包含n个结点的二叉树的高度至少为log2 (n+1)(向上取整)或者(log2 n)+1(括号内向下取整)在任意一棵二叉树中,若终端结点(度为0)的个数为n0,度为2的结点数为n2,则n0=n2+1(n0=1+ n2+2n3+……+(n-1)nm);完全二叉树结点数N为奇数时,它有(N/2)+1个叶结点,当N为偶数时,它有N/2个结点;N个节点可构成的多少种类型的二叉树C(2n,n)/(n+1);有n个结点的完全二叉树,i为某节点a的编号,a双亲结点的编号为i/2向下取整,2i<=n,左孩子编号为2i,反之,无左孩子;2i+1<=n,右孩子编号为2i+1,反之,无右孩子;遍历:前序——根左右,中序——左根右,后——左右根;
二叉树存储:
二叉树遍历(前中后、深度、广度优先遍历):
对树、B+树的理解,树与图:
(1)字符串反转(逆序输出)
给出s = "the sky is blue",返回"blue is sky the"
字符逆序:输入—I am a student 输出-tneduts a ma I
(2)字符串匹配:字符串相等/子序列(移除法、查找法)
(3)字符串中第一个只出现一次的字符
(4)字符串所有组合
(5)字符串中每个字符出现的次数
(1)并集(有序/无序):
(2)交集:
二路归并(array1[i]==array2[j], array1[i]>array2[j], array1[i]<array2[j]);
两个哈希表计数,为2则相交;遍历数组,查询哈希表,存在,相交;
(3)有序/无序数组中,统计给定数字出现的次数?最大?
二分查找改进
(4)重复次数最多的数?出现次数超过一半的数?唯一重复?
定义一个 int count[max];
(5)最大最小值
(6)进制转换(26进制转换)
(7)链表:双链表的逆序反转?环形链表的判断?合并多个单有序链表(单链表与双链表的区别、链表与数组的区别)
(8)回文数
思路1:将数字转化为字符串
思路2:利用数字的整除和取余;
(9)斐波那契数列
前n项斐波那契数列之和:
(10)分数数列求和
(11)ABC求非空子集
(12)最长01字串的长度
思路1:使用正则表达式,若是01/10,count++;
思路2:判断前一位跟后一位,若不相同,count++;
(13)青蛙跳台阶问题
思路:递归式、迭代式,实现如下:
(14)一个无序,不重复数组,输出N个元素,使得N个元素的和相加为M,给出时间复杂度、空间复杂度。手写算法
(15)二叉树给出根节点和目标节点,找出从根节点到目标节点的路径
(1)数组元素地址计算:按行优先——Loc(A[0][0])+(i*n+j)*C(每行n个元素)
按列优先——Loc(A[0][0])+(j*m+i)*C(每行m个元素)
(2)堆的结构?堆和树的区别?堆和栈在内存中的区别是什么?
堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。
数据结构方面:堆先进先出;栈先进后出;实际实现:堆和栈的空间分配 -堆内存放的是实体(数组、new的对象),栈内存放的是局部变量;栈内存更新速度快于堆内存(局部变量生命周期短);栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。
(3)什么是深拷贝和浅拷贝?
(4)GC算法(各种算法的优缺点以及应用场景);
(5)子串包含问题(KMP 算法)写代码实现;
(6)蚁群算法与蒙特卡洛算法
(7)常见算法思想问题
给阿里2万多名员工按年龄排序应该选择哪个算法?万亿级别的两个URL文件A和B,如何求出A和B的差集C(提示:Bit映射->hash分组->多文件读写效率->磁盘寻址以及应用层面对寻址的优化)百度POI中如何试下查找最近的商家功能(提示:坐标镜像+R树)。两个不重复的数组集合中,这两个集合都是海量数据,内存中放不下,怎么求共同的元素?一个文件中有100万个整数,由空格分开,在程序中判断用户输入的整数是否在此文件中,说出最优的方法;一张Bitmap所占内存以及内存占用的计算;2000万个整数,找出第五十大的数字?烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢?5枚硬币,2正3反如何划分为两堆然后通过翻转让两堆中正面向上的硬8币和反面向上的硬币个数相同?x个苹果,一天只能吃一个、两个、或者三个,问多少天可以吃完?