数据结构之查找表

前言

今天学习数据结构看到了一个词-静态查找表,还有与之对应的动态查找表,然后我发现。

啊,这是个啥,好像知道又好像不知道,不就是查找吗,干嘛弄这些专业的说法,回头翻了一下数据结构的书,才发现......。

唉,小小的抱怨一下,不过,我从这两个词联想到了一门基础但是要精通又不简单的学问,就是查找,然后还有前天被面试官问到的一个查找题,题目很简单,如何查找单向链表中倒数第K个数?当然你先遍历一遍数组,获取数组的总长度,然后再遍历一遍找倒数第K个数,当然可以,但是既然是面试题,这样的答案基本是凉凉的,我自己都不满意,更别提人家面试官了,当你抛出这个答案之后,面试官会说如果只遍历一遍呢?你就懵逼了,如果你和我一样懵逼的话,那么恭喜你,你现在还来得及,当然正确方法我就不说了,感兴趣的可以去想想,实在想不出来,我相信你会有办法的,xixixi,也不难。

好了,说了这么多,今天既然发现了自己的一个薄弱区-查找,指不准以后哪天还会在查找这里栽倒,于是,何不在这之前好好梳理一下查找这块呢?

目录

1.静态查找表

2.动态查找表

3.哈希表

正文

首先我们需要明白下静态查找表和动态查找表的定义,所谓的静态查找表是指在查找过程中只进行查找操作,动态查找表就是在查找过程中还会进行插入和删除操作,例如,查找某个元素,若查找到了,则删除。

1.静态查找表

静态查找表可以有不同的表示方法,在不同的表示方法中,实现的查找操作方法也不同。

这里列举平时遇到的最为常见的两种情况

a.以顺序表或线性链表表示静态查找表,则查找可用顺序查找来实现

b.以有序表(排好顺序的顺序表) 表示静态查找表,则查找可用折半查找(二分查找)来实现

第一种,就是一个for循环的事,就不赘述了,这里看一下第二种情况,也就是二分查找的代码,思想就是从中间位置起开始查找,如果正好位于正中间,那么就找到了,如果比正中间数据大,那么在后半部分查找,假设整个数据是升序,如果比正中间数据小,那么在前半部分查找,依次类推,递归结束的标志就是左边界大于右边界,也就是已经不能再分了,如果此时还没查找到,那么就返回未查找到即可

public class BinarySearch {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] a=new int[]{2,3,5,8,9};
		int index=search(a,50);
		System.out.println(index);
	}
	public static int search(int[] a,int data){
		return binarlSearch(a, 0, a.length-1,data);
	}
	public static int binarlSearch(int[] a,int left,int right,int data){
		if(left>right)
			return -1;
		int mid=(left+right)/2;
		if(a[mid]==data){
			return mid;
		}else if(a[mid]<data){
			return binarlSearch(a, mid+1, right, data);
		}else{
			return binarlSearch(a, left, mid-1, data);
		}
	}
}

上面的只是查找里的入门知识,学任何东西都像打怪升级一样,先从小怪开始,由简变难,下面我们升级来打一个大点的怪!

2.动态查找表

动态查找表的特点是:表结构本身是在查找过

  • 11
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值