当前位置: 首页 > news >正文

数据结构与算法篇--结构不变式--动态数组

动态数据列表类的不变式

重点:形式化定义转换成 checkInvariants 代码

DArrayList

DArrayListTest

形式化定义

Invariant:(1) data != null(2) capacity > 0(3) 0 <= size <= capacity(4) ∀ i ∈ [0, size): data[i] != null(5) ∀ i ∈ [size, capacity): data[i] == null(6) capacity 仅通过 resize() 成倍增长

checkInvariants源码

public void checkInvariants() {// --- 1. 容量与大小约束检查 ---// C1: 容量必须大于 0if (capacity <= 0) {throw new AssertionError("Invariant Broken: Capacity must be positive (capacity=" + capacity + ")");}// C2: Size 必须在 [0, capacity] 范围内if (size < 0 || size > capacity) {throw new AssertionError("Invariant Broken: Size must be between 0 and capacity (size=" + size + ", capacity=" + capacity + ")");}// --- 2. 数组和数据完整性检查 ---// D1: 底层数组必须存在if (data == null) {throw new AssertionError("Invariant Broken: Internal array 'data' must not be null.");}// D2: 数组的实际长度必须等于记录的 capacityif (data.length != capacity) {throw new AssertionError("Invariant Broken: data.length (" + data.length + ") does not match recorded capacity (" + capacity + ")");}// --- 3. 数据填充和空值约束检查 ---// 验证有效数据范围 [0, size-1]for (int i = 0; i < size; i++) {// D3: 有效数据区域 [0, size-1] 不得包含 nullif (data[i] == null) {// 根据您的 add 方法,data[i] 应该是非空的throw new AssertionError("Invariant Broken: Element at index " + i + " must not be null (size=" + size + ")");}}// 验证闲置空间范围 [size, capacity-1]for (int j = size; j < capacity; j++) {// D4: 闲置空间 [size, capacity-1] 必须为 null (防止内存泄漏)if (data[j] != null) {throw new AssertionError("Invariant Broken: Element at index " + j + " must be null to prevent memory leak (size=" + size + ", capacity=" + capacity + ")");}}InternalIterator it = new InternalIterator();int elementsFound = 0;while(it.hasNext()) {try {it.next();elementsFound++;} catch (NoSuchElementException e) {throw new AssertionError("Iterator failed unexpectedly near index " + elementsFound);}}if (elementsFound != size) {throw new AssertionError("Iterator found " + elementsFound + " elements, but size is " + size);}
}

使用指南

  1. 整合代码:checkInvariants() 方法添加到您的 DArrayList 类定义中。
  2. 插入调用: 在每个修改数组状态的方法(DArrayListaddremove 以及私有方法 resize)的末尾调用 this.checkInvariants();

通过这种方式,每次修改数组后,程序都会进行一次快速的自我验证,确保您的动态扩容和元素移动逻辑没有破坏任何核心不变式。

http://www.dtcms.com/a/446356.html

相关文章:

  • 做企业网站前期需要准备什么网站做定制还是固定模板
  • 模板引擎驱动的动态计划书生成系统
  • 网站建设与维护好学吗做网站优化有什么方法
  • BLDCPMSM电机控制器硬件设计工程(四)控制器功率模块IGBT和SIC MOS介绍及驱动方案
  • opencart做视频网站哪些php网站
  • 追踪 - 两张图片引发的地理位置暴露
  • 基于「YOLO目标检测 + 多模态AI分析」的光伏板缺陷检测分析系统(vue+flask+模型训练+AI算法)
  • 【Misc】CTFSHOW 入门 wp
  • 网站优化分析杭州网站建设公司
  • 每日一个C语言知识:C语言基础语法
  • 国内红酒网站建设wordpress创建登录页
  • 什么软件能把做的网站上传wordpress商品主图
  • Giants Shoulder - Samsung: LPDDR6 Key Architecture Share
  • 如何设计优秀的企业微信私域运营实战培训方案
  • 数据结构入门 (六):公平的艺术 —— 深入理解队列
  • 计算某字符出现次数
  • 智慧物流企业网站建设方案创意广告图片及文字解析
  • 医院网站建设思路太原制作响应式网站
  • ALiBi是否会替代YaRN?
  • java数据结构
  • 建设标准下载网站个人网站名称要求
  • Delphi Architect Crack
  • 网页设计与网站架设少儿编程平台
  • 广州网站开发创意设计网站上放个域名查询
  • MySQL索引特性
  • 网站建设中 英语公司装修费用可以一次性入账吗
  • 塑胶原料东莞网站建设课程建设类教学成果奖网站
  • 重庆房地产网站建设如何增加网站的流量
  • RT-Thread 移植教程 基于GD32F4XX
  • wordpress网站换主机网站设计形式