查找

一、线性表查找

顺序查找
存储结构可以是顺序表,也可以是链表。逐个比较查询,如果找到则返回数据或索引,如果没找到返回null。时间复杂度T(n)=O(n)
折半查找
又叫二分查找,这种查找方法需要待查的表满足两个条件:1.必须是顺序存储结构。2.按着关键字大小有序排列。

在这里插入图片描述

/**
 * 
 */
package com.liang.datastructure.search;

/**
 * 顺序查找
 * 
 * 存储结构可以是顺序表也可以是链表
 * T(n)=O(n)
 * S(n)=O(1)
 * 
 * 效率低
 * @author Administrator
 *
 */
public class TestSearch01 {
	public static void main(String[] args) {
		//要查找的数组
		int[] arr= {45,88,99,12,78,45,96,100,78,30};
		//查找的值
		int score=111;
		//查找
		int index=search(arr, score);
		//结果
		if(index==-1) {
			System.out.println("不存在");
		}else {	
			System.out.println(score+"的位置:"+index);
			
		}
	}
	public static int search(int arr[],int score) {
		int index=-1;
		for(int i=0;i<arr.length;i++) {
			if(arr[i] == score) {
				index=i;
				break;
			}
		}
		return index;
	}
	
}

/**
 * 
 */
package com.liang.datastructure.search;

/**
 * 二分(折半)查找
 * T(n)=O(logN)
 * 用于顺序存储结构,按着一定的关键字排序
 * @author Administrator
 *
 */
public class TestSearch02 {
	public static void main(String[] args) {
		int[] arr= {1,8,6,9,25,79,80,88,89,90,100};
		int score=9;
		int index=binarySearch(arr, score);//非递归
		int index1=search(arr, score);//递归
		if(index==-1) {
			System.out.println("不存在");
		}else {	
			System.out.println(score+"的位置:"+index);
			
		}
		if(index1==-1) {
			System.out.println("不存在");
		}else {	
			System.out.println(score+"的位置:"+index1);
			
		}
	}
	/**
	 * 不使用递归
	 * @param arr
	 * @param score
	 * @return
	 */
	public static int binarySearch(int[] arr,int score) {
		int low=0;
		int height=arr.length;
		while(low<=height) {
			int mid=(low+height)/2;
			if(arr[mid]==score) {
				return mid;
			}else if(arr[mid]<score){	
				low=mid+1;
			}else if(arr[mid]>score) {
				height=mid-1;
			}
		}
		return -1;
	}
	/**
	 * 使用递归
	 * @param arr
	 * @param score
	 * @return
	 */
	public static int search(int[] arr,int score) {
		int low=0;
		int height=arr.length;
		return search(arr, score,low,height);
		
	}
	private static int search(int[] arr,int score,int low,int height) {
		if(low>height) {
			return -1;
		}
		int mid=(low+height)/2;
		if(arr[mid]==score) {
			return mid;
		}else if(arr[mid]<score){	
			return search(arr, score, mid+1, height);
		}else{
			return search(arr, score, low, mid-1);
		}
		
	}
	
	
}

二、查找树

二叉查找/排序树 BST
是一颗空树或具有一下性质的二叉树:
1、若左子树不空,则左子树上所以节点的值均小于根节点的值;
2、右子树上所以节点的值均大于根节点的值;
3、它的左右子树也均为二叉排序树。
在这里插入图片描述
所以对二叉树中序遍历得到有序集合。
平衡二叉树
目的:减少二叉查找树层次,提高查找速度
平衡二叉树又被称为AVL树
可以是一颗空树,或他的左右两个子树的高度差(平衡因子:树的高度)的绝对值不超过1
并且它的左右子树都是平衡二叉树
平衡二叉树一定是二叉搜索树,反之不一定
平衡二叉树的常用算法有AVL、红黑树、替罪羊树等。
在这里插入图片描述

红黑树

红黑树也是二叉查找树,我们知道,二叉查找树这一数据结构并不难,而红黑树之所以难是难在它是自平衡的二叉查找树,在进行插入和删除等可能会破坏树的平衡的操作时,需要重新自处理达到平衡状态。

红黑树的性质
  1. 每个结点不是红就是黑色
  2. 不可能有连在一起的红色结点
  3. 根结点(root)都是黑色
  4. 每个红色结点的两个子结点都是黑色,叶子结点都是黑色
  5. 如果一个结点存在黑子结点,那么该结点肯定有两个子结点
红黑树的自平衡

1、改变颜色:红变黑,黑变红
2、左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变。
在这里插入图片描述
3、右旋:以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变。
在这里插入图片描述

变换规则

旋转和颜色变换规则:所以默认插入的结点默认为红色。
1、变颜色的情况:当前结点的父亲是红色,且它的叔叔结点也是红色。
( 1 )把父节点设为黑色
( 2 )把叔叔也设为黑色
( 3 )把祖父也就是父亲的父亲设为红色 (爷爷 )
(4 )把指针定义到祖父结点设为当前要操作的(爷爷)分析的点变换的规则
在这里插入图片描述
2、左旋:当前父结点是红色,叔叔是黑色的时候,且当前的结点是右子树。左旋以父结点作为左旋。
在这里插入图片描述
3、右旋:当前父结点是红色,叔叔是黑色的时候,且当前的结点是左子树。右旋。如上图
(1)把父结点变为黑色
(2)把祖父结点变为红色(爷爷)
(3)以祖父结点旋转(爷爷)

b树

b+树

b*树

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值