0%

1.多线程基础

1.1 线程和进程的区别:

进程 线程
定义 进程是程序执行时的一个实例,即它是程序已经执行到何种程度的数据结构的汇集。 线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
根本区别 进程是操作系统资源分配的基本单位 线程是处理器任务调度和执行的基本单位
资源开销 每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销 可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计 数器(PC),线程之间切换的开销小。
包含关系 如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的 线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
内存分配 进程之间的地址空间和资源是相互独立的 同一进程的线程共享本进程的地址空间和资源
影响关系 一个进程崩溃后,在保护模式下不会对其他进程产生影响 一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
执行过程 每个独立的进程有程序运行的入口. 顺序执行序列和程序出口,可并发执行 线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,可并发执行
阅读全文 »

1.1 基础知识

哈希表:也叫做散列表。是根据关键字和值(Key-Value)直接进行访问的数据结构。也就是说,它通过关键字 key 和一个映射函数 Hash(key) 计算出对应的值 value,然后把键值对映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数(散列函数),用于存放记录的数组叫做 哈希表(散列表)。 哈希表的关键思想是使用哈希函数,将键 key 和值 value 映射到对应表的某个区块中。可以将算法思想分为两个部分:

向哈希表中插入一个关键字:哈希函数决定该关键字的对应值应该存放到表中的哪个区块,并将对应值存放到该区块中
在哈希表中搜索一个关键字:使用相同的哈希函数从哈希表中查找对应的区块,并在特定的区块搜索该关键字对应的值

阅读全文 »

1.1 基本知识

二叉树(Binary Tree)是n(n≥0)个有限元素的集合,该集合或者为空,或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成。当集合为空时,称该二叉树为空二叉树。

阅读全文 »

单调栈是一种栈式的数据结构,它的特点在于:栈内元素从栈底到栈顶呈现非递增或者非递减。

对于一个一维数组:arr = [2, 1, 5, 6, 2, 3],如何建立一个从栈底到栈顶的非递减栈呢?

首先,从数组的0下标开始,因为此时栈为空,直接将下标0压入栈中。

阅读全文 »

动态规划(Dynamic Programming)是一种分阶段求解决策问题的数学思想,它通过把原问题分解成简单的子问题来简化求解的难度。如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的。

阅读全文 »

一直以来,对Java虚拟机中的运行时数据区域这个概念不是很能理解,今天,就好好来聊一下什么是运行时数据区域。

1.Java编译过程

java整个编译以及运行过程可以简化为:

阅读全文 »

关于回溯算法的介绍:回溯其实就存在于递归函数下面,回溯算法是一种暴力搜索法。对于一些问题来说,能够使用暴力搜索法解决就已经很好了,使用一层一层的for循环嵌套,根本都搜索不出来的时候,使用回溯算法就可以搜索出所有解法。

回溯算法能够解决的问题:

阅读全文 »

排序类

  1. 下一个排列

    问题描述:整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。

    例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。
    整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。

阅读全文 »

链表类算法

分治法

  1. 合并k个升序链表

    问题描述:给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。

    示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    输入:lists = [[1,4,5],[1,3,4],[2,6]]
    输出:[1,1,2,3,4,4,5,6]
    解释:链表数组如下:
    [
    1->4->5,
    1->3->4,
    2->6
    ]
    将它们合并到一个有序链表中得到。
    1->1->2->3->4->4->5->6
阅读全文 »