实验一 线性表的顺序存储与实现_数据结构与算法(一)顺序表和单链表的比较...

本文详细介绍了线性查找和二分查找两种常见的搜索算法。线性查找从头到尾遍历列表,时间复杂度为O(N)。而二分查找适用于有序列表,通过不断缩小搜索范围,时间复杂度为O(log N)。此外,文章还提供了Java代码示例,展示了这两种查找方法的实现。线性表的顺序存储结构及插入、删除操作也在文中提及,强调了它们的操作流程和潜在问题。
摘要由CSDN通过智能技术生成
760f065bf783ffd1e3dc05adc98b00f1.png

线性查找法

  • 线性查找又称顺序查。基本思路是从第一个记录开始,
  • 逐个比较记录的关键字,直到和给定的K值相等,则查找成功;
  • 若比较结果与文件中n个记录的关键字都不等,则查找失败。
  • 时间复杂度:O(N)

二分查找法

  • 二分查找法又叫折半查找法。比如小时候玩的猜数字游戏
  • 胖虎说:大熊你猜猜我现在心中想的数字是什么。给你一个范围1-100之间,不限次数猜,猜不中就打你一次,看你需要被我打多少次才可以猜出来(心中想的是25)。
  • 大熊想:…. 心中犯嘀咕。这不是明摆着欺负我。不行我得拿出吃奶的力气快速想出来。减少挨打的份 大熊随口说两个50
  • 胖虎说:不对。随即甩手就是一嘴巴。
84900612b95b2a7ea4bdcab460350bc9.png
  • 并说太高了
  • 大熊:…. 真TM难。思考一番。那我就在减半 随口说是数字:25
7d6aa153d97f11d46e0c8fc091860b7c.png
  • 这次就猜对了

类似这种折半猜数字的方法就是二分法查找。

基本思路

  • 首先设置一个左标记为0和一个右标标记为当前数组长度,
  • 第二步 让当前待查元素与表中间元素进行匹配,如果一致则直接返回中间索引,
  • 第三步 如果小于中间索引则让右标记等于当前中间索引,
  • 第四步 如果大于中间索引,则让左标示等于当前中间索引
  • 二分法查找比线性查找才查询次数上会大大减少。所以效率也就高了。就是要待查询的表为有序表,并且只对查询效率有所优化,
  • 当修改和插入数据的时候这种效率就很低了。

代码示范

public class 二分法查找 { public static void main(String[] args) { int[] number = {1,2,3,4,5,6,7,8,9,10}; int key = 10; int result =halfSort(number, key); System.out.println("查找出的下标:"+result); } public static int halfSort(int[] data,int key){ int leftIndex=0; //左标记 int rightIndex=data.length; //右标记 int curnIndex=-1 ; //返回结果 if(key>rightIndex){ return curnIndex; } while(leftIndex<=rightIndex){ //进行中间判断 int half = (leftIndex+rightIndex)/2; if(data[half] == key){ curnIndex =half; break; }else if(data[half] < key){ leftIndex = half; }else{ rightIndex = half; } } return curnIndex; }}

线性表

0个或多个数据元素的有限序列。 首先它是一个序列。也就是说,元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继 。

线性表的顺序存储结构

线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。

顺序存储结构

插入算法思路:

  • 如果插入位置不合理,抛出异常;
  • 如果线性表长度大于等于数组长度,则抛出异常或动态增加容量;
  • 从最后一个元素开始向前遍历到第 i 个位置,分别将它们都向后移动一个位置;
  • 将要插入元素填入位置 i 处,表长加 1 。
dc92bc5e052bb65684eba1b2b7933d94.png

删除算法的思路:

  • 如果删除位置不合理,抛出异常 i
  • 取出删除元素;
  • 从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动 一
  • 个位置;
  • 表长减 1 。
c8e974f36369ef2d9b9e9fe2291c0943.png

代码实现

public interface MyList { int size(); boolean contains(Object o); void add(int i,E e)throws Exception; void add(E e)throws Exception; void remove(int i)throws Exception ; String toArray();}public class MyArrayList implements MyList { //数组作为线性表的存储空间 private Object[] elementData; //线性表的当前长度 private int size; public MyArrayList(int initialCapacity) { //初始化数据大小 this.elementData=new Object[initialCapacity]; this.size=0; } @Override public int size() { return size; } @Override public boolean contains(Object o) { if (o == null){ for (int i = 0; i < size; i++) if (elementData[i]==null) return true; }else{ for (int i = 0; i < size; i++) if (o.equals(elementData[i])){ return true; }  } return false; } @Override public void add(int i, E e) throws Exception{ if(size==elementData.length){ throw new Exception("存储空间已满"); } if(i<0 || i>size){ throw new Exception("添加参数下标越界"); } for (int j = size; j > i; j--){ // 插入位置及之后的元素后移(下标加1) 比如 123 插入元素4 到的2的位置 elementData[j] = elementData[j - 1]; ; System.out.println("移动:"+toArray()); } elementData[i] = e; //插入 ++size; //长度增加 System.out.println("移动:"+toArray()); } /** * 插入算法的思路; , 如果插入位置不合理,抛出异常; • 如果线性表长度大于等于数组长度,则抛出异常或动态增加容量; • 从最后一个元素开始向前遍历到第 i 个位置,分别将它们都向后移动一个位 置; • 将要插入元素填入位置 i 处; • 表长加 1 。 */ @Override public void add(E e)throws Exception { if(size==elementData.length){ throw new Exception("存储空间已满"); } elementData[size++] =e; } /** * 删除算法的思路: • 如果删除位置不合理,抛出异常 i • 取出删除元素; • 从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动 一 个位置; • 表长减 1 。 */ @Override public void remove(int i)throws Exception { if (i < 0 || i > size - 1){ throw new Exception("删除位置不合法"); } for (int j = i; j < size - 1; j++) { elementData[j] = elementData[j + 1];// 被删除元素之后的元素左移  } size--; // 表长度减1  } @Override public String toArray() { StringBuilder str=new StringBuilder(); str.append("toArray:["); for (int i = 0; i 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值