吉祥坊注册

Java面试题-算法篇十七

吉祥坊备用网址

作者:Amu Man

公共号码Java Companion

170,内存中堆和堆栈的区别是什么?

概念:

堆栈是为执行线程而保留的内存空间。调用该函数时,堆栈的顶部保留用于局部变量和一些簿记数据。执行该功能时,该块无用,可以在下次调用该函数时使用。堆栈通常以后进先出的方式保留空间;因此,最近保留的块通常首先被释放。这样做会使跟踪堆栈变得简单;从堆栈中释放块只不过是指针的偏移量。

堆是为动态分配保留的内存空间。与堆栈不同,没有用于从堆中分配和重新分配块的固定模式;您可以随时分配和释放它。这使得跟踪堆的哪些部分已被分配和释放变得极其复杂;有许多自定义堆分配策略用于调整不同使用模式的堆性能。

差:

内存分配:

堆栈:由编译器自动分配和释放,存储函数参数,局部变量,临时变量,函数返回地址等。

堆:通常由人类分发和发布,它由Java系统发布,但对于C ++等,必须手动释放。如果没有手动释放,则会导致内存泄漏。

系统响应:

堆栈:只要堆栈的剩余空间大于请求的空间,系统就会为程序提供内存,否则会报告异常溢出。

堆:在可用内存地址的链表中查找大于请求空间的堆点,然后从空闲节点列表中删除该节点,并将该节点的空间分配给该程序。

尺寸限制:

堆栈:在Windows下,堆栈是一种数据结构,它扩展到较低的地址并且是连续内存的区域。这意味着堆栈的地址和堆栈是系统预设引用的最大容量,在Windows中,堆栈大小为2M,如果应用程序超出堆栈空间的剩余空间将被提示溢出。因此,堆栈中可用的空间很小。

堆:堆是一种扩展到高地址的数据结构,是一个不连续的内存区域。这是因为系统是存储在链表中的空闲存储器地址,其自然是不连续的,并且链表的遍历方向是从低地址到高地址。堆的大小受计算机系统中有效虚拟内存的限制。

结论:堆获得的空间更灵活,更大。

分销效率:

堆栈:由系统自动分配,速度更快,不能人为控制。

堆:new分配的内存通常较慢,更容易出现内存碎片,但使用起来最方便。

商店内容:

指令的地址,然后是函数的各种参数,在大多数编译器中,参数从右向左推送,然后是函数中的局部变量。请注意,静态变量不会被压入堆栈。堆栈只是相反的顺序。

堆:通常,一个字节用于存储堆头部的堆大小。具体内容由人控制。

171,找到1000以内的所有水仙花的数量

概念:

水仙花数字是指一个三位整数,其数字的三次总和等于数字本身。

解决方案:

9cb235ba84474ad1bbceb77ecd824374

172,比较几种常用的排序算法,只需编写一些你知道的排序算法?

比较:

1.稳定性比较

插入排序,气泡排序,二叉树排序,双向排序和其他线性排序是稳定的

选择排序,山峰排序,快速排序和堆排序是不稳定的

2.时间复杂度比较

插入排序,气泡排序和排序的时间复杂度为O(n2)

其他非线性排序的时间复杂度为O(nlog2n)

线性排序的时间复杂度是O(n);

3.辅助空间的比较

线性排序和双向合并排序的辅助空间是O(n);

其他排序的辅助空间是O(1);

4.其他比较

*插入,冒泡排序较慢,但是当排序序列部分或全局排序时,此排序可以实现更快的速度,但在这种情况下,快速排序速度较慢。

*当n很小时,最好在不需要稳定性时使用分类。如果需要稳定性,则应使用插入或气泡分选。

*如果要排序的记录的关键字在一个非常有限的范围内,并且允许按空格对空间进行排序。

*当n很大时,关键字元素相对随机,并且不需要使用快速排序的稳定性。

*当n很大时,关键字元素可能看起来是自己排序的。当需要稳定性时,最好在空间允许时使用合并排序。

*当n很大时,关键字元素可能看起来是自己排序的,当不需要稳定性时,应该使用堆排序。

常见的排序算法:

选择排序

6d475593e33b4c6db96504329fc544b0

插入排序

52ac421730d34111b3ccbd846e957276

快速排序

89a9093dc23e4d9bac73ec170cf18d3a

希尔排序

0d91bc5588aa4c5a85dd084f0f698634

首先列在这里,谁有其他算法的例子或这些算法的其他更好的解决方案,欢迎留言!