「java左旋右旋」怎么判断左旋右旋

博主:adminadmin 2023-01-24 13:54:09 390

今天给各位分享java左旋右旋的知识,其中也会对怎么判断左旋右旋进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

8种数据结构

常见的8种数据结构:数组、链表、栈、队列、树、堆、图、哈希表

1.数组:

优点:按照索引查询元素的速度很快

缺点:数组的大小在创建后就确定了,不方便扩容;数组只能存储一种类型的数据;添加,删除元素的操作很耗时间,因为要移动其他元素

2.链表:

优点:链表在插入,删除的时候可以达到O(1)的时间复杂度并且链表克服了数组必须预先知道数据大小的缺点,从而可以实现灵活的内存动态管理

缺点:含有其他结点的引用,占用内存空间大;查找元素需要遍历整个链表,耗时。

3.栈

栈按照“先进后出”的原则来存储数据,先插入的数据被压入栈底,后插入的数据在栈顶,读出数据的时候,从栈顶开始依次读出。

4.队列

与栈不同,队列对两端进行定义,一端叫队头,另外一端就叫队尾。队头只允许删除操作(出队),队尾只允许插入操作(入队)。

5.树

1.二叉树:每个节点最多含有两个子树,按照左右不同的表现形式又可以分为多种。

2完全二叉树:对于一颗二叉树,假设其深度为d.除了第d层,其它各层的节点数目均已达最大值,且第d层所有节点从左向右连续的紧密排列

3满二叉树:一颗每一层的节点数都达到了最大值的二叉树。

:对于二叉查找树中的任意一个节点如果左子树不为空,那么左子树上所有节点的值均小于它的根节点的值;如果右子树不空,右子树上所有节点的值均大于它的根节点的值。

基于二叉树的特点,它相比较与其它数据结构的优势在于查找、插入的时间复杂度比较低,为O(logn)。

:平衡二叉树本质上也是一颗二叉查找树,不同的是该树中任意节点的两颗子树的高度差不大于1

注:平衡二叉树的难点在于,当删除或者增加节点的情况下,如何通过左旋或者右旋的方式来保持左右平衡。

java中最常见的平衡二叉树就是红黑树,它具有以下特点:

(1)每个节点都只能是红色或者黑色

(2)根节点是黑色

(3)每个叶节点是黑色的

(4)如果一个节点是红色的,则它两个子节点点都是黑色的。也就是说在一条路径上不能出现相邻的两个红色节点

(5)从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点

:一种对读写操作进行优化的自平衡的二叉查找树,能够保持数据有序,拥有多于两个的子树。

6. :堆可以被看作是一棵树的数组对象,具有以下特点:

(1)堆中某个节点的值总是不大于或不小于其父节点的值

(2)堆总是一颗完全二叉树

将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆

7. :由顶点的有穷非空集合和顶点之间边的集合组成

8. :是一种可以通过关键码值(key-value)直接访问的数据结构,它最大的特点就是结合了数组和链表的优点可以快速实现查找、插入和删除。

哈希函数在哈希表中起着非常关键的作用, ,该输出就是哈希值。

哈希表是是通过数组来实现的,首先对key值进行hash算法得到一个数,然后对该数进行寻址算法计算,得到一个数组中的下标,通过该下标对数据进行存取,解决地址冲突常用方法有链表法。Java里的HashMap使用的是链表法。

在linux操作系统内核实现里经常使用的红黑树

在linux操作系统内核实现里经常使用的红黑树如下:

二叉树,按中序遍历后为一递增数组,自平衡意味着树的高度有一个上限,对于红黑树,其为2log(n+1),所以时间复杂度为最差为Olog(n)。

赋予二叉搜索树自平衡特性的方法有多种,红黑树通过一下4条约束实现自平衡:

Every node is either red or black.

All NIL nodes (figure 1) are considered black.

A red node does not have a red child.

Every path from a given node to any of its descendant NIL nodes goes through the same number of black nodes.

其中根节点为黑色。

红黑树的搜索与二叉搜索树无异,但是插入和删除可能会违背上述四条原则。需要用到左旋右旋操作。左旋右旋上图,可以看到左旋右旋本身不改变二叉搜索树的特性,旋转后必要时改变节点的颜色可消除插入或者删除带来的红冲突和黑冲突,有时红黑树的重新平衡需要迭代进行。

红黑树比较适合的应用场景:

需要动态插入、删除、查找的场景,包括但不限于:

某些数据库的增删改查,比如select * from xxx where 这类条件检索。

linux内核中进程通过红黑树组织管理,便于快速插入、删除、查找进程的task_struct。

linux内存中内存的管理:分配和回收。用红黑树组织已经分配的内存块,当应用程序调用free释放内存的时候,可以根据内存地址在红黑树中快速找到目标内存块。

hashmap中(key,value)增、删、改查的实现;java 8就采用了RBTree替代链表。

Ext3文件系统,通过红黑树组织目录项。

java俄罗斯方块旋转算法,求解

可以给每一个小方块设置为一个坐标,变为一个三阶行列式,3*3矩阵,转变为二元数组旋转。观察一下左旋:

11 12 13                       31 21 11

21 22 23           →→      32  22  12

31 32 33                        33  23  13

坐标变换如下:(1,1)变为(1,3),(1,2)变为(2,3),(1,3)变为(3,3)

(2,1)变为(1,2),(2,2)变为(2,2),(2,3)变为(3,2)

(3,1)变为(1,1),(3,2)变为(2,1),(3,3)变为(3,1)

规律就是(i,j)变为(j,3-i+1):

如果是2*2的方格,就可以变为二阶行列式,也就是2*2的二元数组,这里给出3*3九宫格改变的示意,我的代码如下:

import java.util.Random;

public class T{

public static void main(String[] args){

int[][] a=new int[3][3];

System.out.println("now begin to form a new integer array");

Random r=new Random();

for(int i=0;i3;i++){

for(int j=0;j3;j++){

a[i][j]=r.nextInt(10);

}

}

System.out.println("the array is shown as follows:");

for(int i=0;i3;i++){

for(int j=0;j3;j++){

System.out.print(a[i][j]+" ");

}

System.out.println();

}

System.out.println("左转九十度");

for(int i=0;ia.length;i++){

for(int j=0;ja[i].length;j++){

System.out.print(a[a[i].length-1-j][i]+" ");

}

System.out.println();

}

}

}

JDK8的HashMap中红黑树左旋右旋原理图解

上一篇 ConcurrentHashMap在JDK1.8版本比1.7改进了什么

下一篇 基于LinkedHashMap手写LRU淘汰策略

相关文章链接:

Java集合类图总览

ArrayList的添加和删除操作实现原理图解

ArrayList的动态扩容、ModCount及fail-fast原理

LinkedList增删改查操作底层实现原理

数组拷贝的几种方式及和链表结构的对比

Jdk1.7HashMap源码分析

Jdk1.7HashMap如何扩容及解决死循环问题

JDK1.8HashMap源码分析

ConcurrentHashMap在JDK1.8版本比1.7改进了什么

基于LinkedHashMap手写LRU淘汰策略

HashSet集合底层实现原理

HashTable底层实现原理及和ConcurrentHashMap区别

java集合常见面试题

集合结构分析&线程并发库

们用的比较多List包括ArrayList和LinkedList

注意:transient:java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。换句话来说就是,用transient关键字标记的成员变量不参与序列化过程。

红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。

在树的结构发生改变时(插入或者删除操作),往往会破坏上述条件3或条件4,需要通过调整使得查找树重新满足红黑树的条件。如果有删除或者插入节点,使用左旋和右旋;

HashMap提供了4个构造函数:

在这里提到了两个参数:初始容量,加载因子。这两个参数是影响HashMap性能的重要参数,其中容量表示哈希表中桶的数量,初始容量是创建哈希表时的容量,加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度,它衡量的是一个散列表的空间的使用程度,负载因子越大表示散列表的装填程度越高,反之愈小。对于使用链表法的散列表来说,查找一个元素的平均时间是O(1+a),因此如果负载因子越大,对空间的利用更充分,然而后果是查找效率的降低;如果负载因子太小,那么散列表的数据将过于稀疏,对空间造成严重浪费。系统默认负载因子为0.75,一般情况下我们是无需修改的。

强烈建议使用EntrySet进行遍历。

涉及问题:

进程是资源分配的最小单位,线程是程序执行的最小单位。

进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。

线程是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。同样多线程也可以实现并发操作,每个请求分配一个线程来处理。

实现 Runnable 和 Callable 接口的类只能当做一个可以在线程中运行的任务,不是真正意义上的线程,因此最后还需要通过 Thread 来调用。可以说任务是通过线程驱动从而执行的。

实现接口 VS 继承 Thread :

Thread和Runable的联系和区别

产生线程阻塞的原因:

给定一个进程内的所有线程,都共享同一存储空间,这样有好处又有坏处。这些线程就可以共享数据,非常有用。不过,在两个线程同时修改某一资源时,这也会造成一些问题。Java 提供了同步机制,以控制对共享资源的互斥访问。

Synchronized关键字

synchronized与Lock的区别

wait()、notify()、notifyAll()它们都属于 Object 的一部分,而不属于 Thread。而 sleep() 是 Thread 的静态方法。只有在同步控制方法或同步控制块里才能调用 wait() 、notify() 和 notifyAll()。

ThreadLocal 是解决线程安全问题一个很好的思路,它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。在很多情况下,ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性。

ThreadLocal类提供的几个方法:

get()方法是用来获取ThreadLocal在当前线程中保存的变量副本,set()用来设置当前线程中变量的副本,remove()用来移除当前线程中变量的副本,initialValue()是一个protected方法,一般是用来在使用时进行重写的,它是一个延迟加载方法。

每个线程Thread内部有一个ThreadLocal.ThreadLocalMap类型的成员变量threadLocals,这个threadLocals就是用来存储实际的变量副本的,键值为当前ThreadLocal变量,value为变量副本(即T类型的变量)。

初始时,在Thread里面,threadLocals为空,当通过ThreadLocal变量调用get()方法或者set()方法,就会对Thread类中的threadLocals进行初始化,并且以当前ThreadLocal变量为键值,以ThreadLocal要保存的副本变量为value,存到threadLocals。

然后在当前线程里面,如果要使用副本变量,就可以通过get方法在threadLocals里面查找。

ThreadLocal配置多数据源

java的程序

if(ThreadLocalRandom.current().nextInt(10,51) % 5 == 0){

    System.out.println("中奖了");

} else {

    System.out.println("很遗憾,没中奖");

}

关于java左旋右旋和怎么判断左旋右旋的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。