【数据结构】串与数组(二)

简介: 【数据结构】串与数组

4.4.5 KMP算法:求公共前后缀 next数组 -- 推导


  • 当我们准备求公共前后缀时,主串和模式串具有相同的内容,所以只需要看模式串。
  • 实例1:模式串:"abcabc"
  • 提前将模式进行处理(预判):将每一个字符假设不匹配时,公共前后缀提前记录下来,形成一个表格。
  • 第一个位置:-1
  • 第二个位置:0
  • 使用next数组,记录统计好的表格。

image.png

image.png

image.png

4.4.6 KMP算法:求公共前后缀 next数组 -- 算法演示


  • 实例1:模式串:"abcabc"

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

4.4.7 KMP算法:求公共前后缀 next数组 -- 算法


/** 获得next数组* @param T 模式串* return 返回next数组*/publicint[] getNext(IStringT) {
//1. 创建数组,与模式串字符个数一致int[] next=newint[T.length()];       
intj=1;                              // 串的指针intk=0;                              // 模式串的指针(相同字符计数器)// 2 默认情况next[0] =-1;                           
next[1] =0;
// 3 准备比较while( j<T.length() -1 ) {            // 比较倒数第二个字符if(T.charAt(j) ==T.charAt(k)) {    // 连续有字符相等next[j+1] =k+1;
j++;
k++;
        } elseif (k==0) {
next[j+1] =0;
j++;
        } else {        //k不是零k=next[k];                //p119 数学推导        }
    }
// 4 处理完成,返回数组returnnext;
}

image.png

image.png

4.4.8 KMP算法:next数组使用


  • 主串:ababababaaa
  • 模式串:ababaaa
  • next数组

image.png

4.4.9 KMP算法


image.png

/** this 当前串,也就是主串 (this.length() 主串长度)* @param T 模式串 (T.length() 模式串长度)* @param start 从主串中开始位置,例如:"abaababaaa".index_KMP("ababaaa",0);*/publicintindex_KMP(IStringT, intstart) {
//1 准备工作:next数组、指针int[] next=getNext(T);            //1.1 获得模式的next数组inti=start;                      //1.2 主串指针intj=0;                          //1.3 模式串的指针//2 字符比较移动while(i<this.length() &&j<T.length()) {    //2.1 串小于长度if(j==-1||//2.2.1 第一个字符不匹配,直接跳过this.charAt(i) ==T.charAt(j)) {//2.2.2 字符匹配i++;
j++;
        } else {
j=next[j];                        //2.3 移动模式串        }
    }
//3 处理结果if(j<T.length()) {                //3.1 移动位置没有模式串长,不匹配return-1;
    } else {
returni-T.length();          //3.2 匹配,目前在串后面,需要移动首字符    }
}

4.5 数组


4.5.1 概述


  • 数组:一组具有相同数据类型的数据元素的集合。数组元素按某种次序存储在一个地址连续的内存单元空间中。
  • 一维数组:一个顺序存储结构的线性表。[a0,a1,a2, ....]
  • 二维数组:数组元素是一维数组的数组。[ [] , [] , [] ] 。二维数组又称为矩阵。

image.png

4.5.2 数组的顺序存储(一维)


  • 多维数组中,存在两种存储方式:
  • 以行序为主序列的存储方式(行优先存储)。大部分程序都是按照行序进行存储的。
  • 以列序为主序列的存储方式(列优先存储)
  • 一维数组内存地址
  • Loc(0) :数组的首地址
  • i : 第i个元素
  • L :每一个数据元素占用字节数

image.png

4.5.3 数组的顺序存储(二维)


1)行序

  • 行序:使用内存中一维空间(一片连续的存储空间),以行的方式存放二维数组。先存放第一行,在存放第二行,依次类推存放所有行。

image.png

二维数组(n×m)内存地址(以==行序==为主序列)

  • Loc(0,0) :二维数组的首地址
  • i : 第i个元素
  • L : 每一个数据元素占用字节数
  • m:矩阵中的列数

image.png

image.png

注意:

  • 如果索引号不是从0开始,不能使用此公式。
  • 如果索引号不是从0开始的,需要先将索引号归零,再使用公式。

image.png

2)列序

  • 列序:使用内存中一维空间(一片连续的存储空间),以列的方式存放二维数组。先存放第一列,再存放第二列,依次类推,存放所有列。

image.png

二维数组(n×m)内存地址(以==列序==为主序列)

image.png

3)练习

  • 实例1:

有一个二维数组A[1..6,0..7],每一个数组元素用相邻的6个字节存储,存储器按字节编址,那么这个数组占用的存储空间大小是( ==D== )个字节。

A. 48

B. 96

C. 252

D. 288

image.png

实例2:


设有数组A[1..8,1..10],数组的每个元素占3字节,数组从内存首地址BA开始以==列序==为主顺序存放,则数组元素A[5,8]的存储首地址为( )。


A. BA + 141


B. BA + 180


C. BA + 222


D. BA + 225

image.png

  • 例如3:

设有数组A[0..8,1..10],数组的每个元素占5字节,数组从内存首地址BA开始以==列序==为主顺序存放,则数组元素A[7,8]的存储首地址为( BA + 350 )。

image.png

相关文章
|
3月前
|
存储 Java 程序员
数据结构之 - 深入了解数组数据结构
数据结构之 - 深入了解数组数据结构
51 6
|
3月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
130 64
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
75 5
|
2月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
62 4
|
3月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
58 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
3月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
32 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
4月前
|
存储 Java
java数据结构,线性表顺序存储(数组)的实现
文章介绍了Java中线性表顺序存储(数组)的实现。线性表是数据结构的一种,它使用数组来实现。文章详细描述了线性表的基本操作,如增加、查找、删除、修改元素,以及其他操作如遍历、清空、求长度等。同时,提供了完整的Java代码实现,包括MyList接口和MyLinearList实现类。通过main函数的测试代码,展示了如何使用这些方法操作线性表。
|
6月前
|
存储
【数据结构OJ题】轮转数组
力扣题目——轮转数组
50 2
【数据结构OJ题】轮转数组
|
5月前
|
存储 Java 程序员
"揭秘HashMap底层实现:从数组到链表,再到红黑树,掌握高效数据结构的秘密武器!"
【8月更文挑战第21天】HashMap是Java中重要的数据结构,采用数组+链表/红黑树实现,确保高效查询与更新。构造方法初始化数组,默认容量16,负载因子0.75触发扩容。`put`操作通过计算`hashCode`定位元素,利用链表或红黑树处理冲突。`get`和`remove`操作类似地定位并返回或移除元素。JDK 1.8优化了链表转红黑树机制,提升性能。理解这些原理能帮助我们更高效地应用HashMap。
53 0
|
7月前
|
存储 算法 调度
【数据结构与算法】详解循环队列:基于数组实现高效存储与访问
【数据结构与算法】详解循环队列:基于数组实现高效存储与访问