大型公司面试必答之数据结构与算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yyjava/article/details/82146187

数据结构

1,概念

数据结构:数据之间的关系,提高程序效率

逻辑关系,人为认为

集合:在一个范围内有多个数据,数据之间没有关系
线性:1对1关系,线性结构,链表呢?
树:1对多关系,树结构,文件目录
图:多对对关系,网状结构

物理关系:内存存储

顺序存储:数组,连续
链式存储:链表,散列

数据结构难不难:容易但很难,技术上就变量循环判断,应用很难,写好循环和判断,其他就是方法调用
有没有用:有用且没有用,编程思想,学会用电脑的思维方式写代码
5!阶乘 50!的阶乘 java中任何类型都存不下,怎么办?
int放不下的值结果为0,double放不下会用科学计算法显示,但是小数点后会丢失精度

算法

大数字运算,使用数组,天文学科学计算等

1,计算每一位
2,进位和留位
输出的时候不显示前面多余的0
两个大数字相乘怎么做
学会画图,用画图先想清楚流程,学的是一种思想

冒泡排序

一个变量,比较后排序
if(arr[j]>arr[j+1]){
          int temp=arr[j];
          arr[j]=arr[j+1];
          arr[j+1]=temp;
        }
冒泡排序的优点:每进行一趟排序,就会少比较一次,因为每进行一趟排序都会找出一个较大值。如上例:第一趟比较之后,排在最后的一个数一定是最大的一个数,第二趟排序的时候,只需要比较除了最后一个数以外的其他的数,同样也能找出一个最大的数排在参与第二趟比较的数后面,第三趟比较的时候,只需要比较除了最后两个数以外的其他的数,以此类推……也就是说,没进行一趟比较,每一趟少比较一次,一定程度上减少了算法的量。

用时间复杂度来说:

  1.如果我们的数据正序,只需要走一趟即可完成排序。所需的比较次数C和记录移动次数M均达到最小值,即:Cmin=n-1;Mmin=0;所以,冒泡排序最好的时间复杂度为O(n)。

  2.如果很不幸我们的数据是反序的,则需要进行n-1趟排序。每趟排序要进行n-i次比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:冒泡排序的最坏时间复杂度为:O(n2) 。
综上所述:冒泡排序总的平均时间复杂度为:O(n2) 。

插入排序

三个循环—两个循环

for(int i =1; i < array.length; i++){
int temp = array[i];
int j = i-1;
while(j>=0 && temp < array[j] ){
array[j+1] = array[j];
j–;
}
array[j+1] = temp;
}

查找排序,二分查找法,有序,已知长度(数据库,索引,红黑树)

ArrayList 和 LinkedList原理,代码实现,性能区别
锁的问题
并发的问题

1,ArrayList,数组与集合的区别:动态大小

增加的时候,自动扩容,size * 3 / 2 +1

重新创建一个数组,将老数组一个一个的的放到新数组,在把新数组赋值给老数组
所以在日常使用中,如果知道数据多少,可以指定数组大小,可以避免扩容有效提高效率,例如分页大小20

清除的时候

只需要设置size=0,内存并没有删除,只有当重新赋值 obj = new Object[10],原来的数组没有引用才会被gc回收
这也是为什么,磁盘拷贝文件的时候非常慢,删除文件的时候非常快

删除指定索引的值

只需要将索引后面的值向前面移动一位就可以,但是原来最后一位还是存在并没有删除
我们是否需要删除呢?不需要,因为我们会吧size– ,数组就访问不到原来的最后一位。

2,LinkedList,数据与地址(对象引用)

线性结构的链表:
单链表
单向循环链表
双链表
双向循环链表

添加:LinkedList效率高
删除:综合LinkedList效率高
ArrayList删除前面的数据,需要涉及到移位,如果从后面往前面删除,效率越高。
单向链表,删除前面的快,删除后面的越慢
双向列表,删除前面和后面的都快,越往中间走效率越低。
获取和设置:ArrayList效率高得多

ArrayList 更适合遍历和查询,通常都是数据库的数据查询出来,然后遍历
LinkedList,更适合修改,例如游戏行业,比如扑克麻将游戏等,不停的维护手上的牌。

栈和队列的代码实现
栈:先进后出
固定大小可以用数组实现栈
动态大小可以用链表实现栈

队列:先进先出
数组实现队列,涉及到数组移位,效率非常低
单向循环链表实现队列,效率非常高

递归:文件夹遍历,快速排序,八皇后,汉罗塔,寻址
二叉树:堆排序,中序排序

猜你喜欢

转载自blog.csdn.net/yyjava/article/details/82146187