Design HashMap.

本文介绍了一种使用链地址法解决冲突的哈希映射实现方式。通过定义哈希条目类LinkedHashEntry和哈希映射类HashMap,实现了基本的插入、查找和删除操作。
// use linked list for chaining.

class LinkedHashEntry {
private:
  int key;
  int value;
  LinkedHashEntry* next;

public:
  LinkedHashEntry(int key, int value) {
    this->key = key;
    this->value = value;
    this->next = NULL;
  }

  int getKey() {
    return key;
  }
  int getValue() {
    return value;
  }
  void setValue(int value) {
    this->value = value;
  }
  LinkedHashEntry* getNext() {
    return next;
  }
  void setNext(LinkedHashEntry *next){
    this->next = next;
  }
}
const int TABLE_SIZE = 128;
class HashMap {
private:
  LinkedHashEntry **table;
public:
  HashMap() {
    table  = new LinkedHashEntry*(TABLE_SIZE);
    for(int i = 0; i < TABLE_SIZE; ++i) {
      table[i] = NULL;
    }
  }

  int get(int key) {
    int hashValue = key %..
    if(table[hashValue] == NULL) {
      return -1;
    } else {
      LinkedHashEntry* entry = table(hashValue);
      while(entry != NULL && entry->getKey()  != key) {
        entry = entry->getNext();
      }
      if(entry == NULL) return -1;
      else return entry->getValue();
    }
  }
  void put(int key, int value) {
    int hashValue = key %...
    if(table[hashValue] == NULL) {
      table[hashValue] = new LinkedHashEntry(key, value);
    } else {
      LinkedHashEntry *entry = table[hashValue];
      while(entry->getNext() != NULL) {
        entry = entry->getNext();
      if(entry->getKey() == key) {entry->setValue(value);}
      else entry->setNext(new LinkedHashEntry(key, value));
    }
  }

  void remove(int key) {
    int hashValue = key % ...
    if(table[hashValue]) {
      LinkedHashEntry *prevEntry = NULL;
      LinkedHashEntry* entry = table[hashValue];
      while(entry->getNext() && entry->getKey() != key) {
        prevEntry = entry;
        entry = entry->getNext();
      }
      if(entry->getKey() == key) {
        if(prevEntry == NULL) {
          LinkedHashEntry* nextEntry = entry->getNext();
          delete entry;
          table[hash] = nextEntry;
        } else {
          LinkedHashEntry *next = entry->getNext();
          delete next;
          prevEntry->setNext(next);
        }
      }
    }
  }
  ~HashMap() {
    for(int i = 0; i < TABLE_SIZE; ++i) {
      if(table[i] != NULL) {
        LinkedHashEntry* prevEntry = NULL;
        LinkedHashEntry* entry = table[i];
        while(entry) {
          prevEntry = entry;
          entry = entry->getNext();
          delete prevEntry;
        }
      }
    }
    delete[] table;
  }
}

【轴承故障诊断】基于融合鱼鹰和柯西变异的麻雀优化算法OCSSA-VMD-CNN-BILSTM轴承诊断研究【西储大学数据】(Matlab代码实现)内容概要:本文提出了一种基于融合鱼鹰和柯西变异的麻雀优化算法(OCSSA)优化变分模态分解(VMD)参数,并结合卷积神经网络(CNN)与双向长短期记忆网络(BiLSTM)的轴承故障诊断模型。该方法利用西储大学公开的轴承数据集进行验证,通过OCSSA算法优化VMD的分解层数K和惩罚因子α,有效提升信号分解精度,抑制模态混叠;随后利用CNN提取故障特征的空间信息,BiLSTM捕捉时间序列的动态特征,最终实现高精度的轴承故障分类。整个诊断流程充分结合了信号预处理、智能优化与深度学习的优势,显著提升了复杂工况下轴承故障诊断的准确性与鲁棒性。; 适合人群:具备一定信号处理、机器学习及MATLAB编程基础的研究生、科研人员及从事工业设备故障诊断的工程技术人员。; 使用场景及目标:①应用于旋转机械设备的智能运维与故障预警系统;②为轴承等关键部件的早期故障识别提供高精度诊断方案;③推动智能优化算法与深度学习在工业信号处理领域的融合研究。; 阅读建议:建议读者结合MATLAB代码实现,深入理解OCSSA优化机制、VMD参数选择策略以及CNN-BiLSTM网络结构的设计逻辑,通过复现实验掌握完整诊断流程,并可进一步尝试迁移至其他设备的故障诊断任务中进行验证与优化。
在软件开发中,验证逻辑不匹配(Validation Mismatch)问题通常出现在数据输入、表单处理或系统逻辑交互过程中。这类问题可能表现为预期与实际校验规则不一致,导致数据错误通过验证或合法数据被错误拒绝。 ### 常见场景与原因分析 1. **前后端验证规则不一致** 前端可能采用 JavaScript 或框架自带的验证机制(如 React Hook Form、Vuelidate),而后端可能使用如 JSON Schema、Spring Validator 等机制。两者对字段长度、格式、必填项等的定义如果不一致,会导致用户输入看似合法却在提交时被拒绝。例如前端允许 100 字符的用户名,而数据库字段仅支持 50 字符[^1]。 2. **表单状态管理错误** 在现代前端框架中,如 React、Vue 中使用状态管理时,如果验证逻辑未正确绑定或触发,可能导致表单提交时绕过某些验证规则。例如未正确监听 `onBlur` 或 `onChange` 事件,导致字段未及时校验[^1]。 3. **正则表达式差异** 验证邮箱、电话号码等字段时,前后端可能使用不同的正则表达式。例如前端使用 `/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/` 验证邮箱,而后端可能使用更宽松或更严格的规则,导致部分合法输入被拒绝[^1]。 4. **国际化与本地化问题** 在多语言或多地区支持的系统中,验证规则可能未考虑不同地区的格式要求。例如日期格式在某些国家为 `DD/MM/YYYY`,而在另一些国家为 `MM/DD/YYYY`,若未正确处理,可能导致验证失败[^1]。 5. **API 接口定义与实际行为不一致** 使用如 Swagger、OpenAPI 定义接口时,若实际后端逻辑未严格遵循定义,可能导致客户端发送的数据被拒绝。例如接口文档中字段为可选,但后端代码中却强制要求非空[^1]。 ### 解决方案建议 1. **统一验证逻辑** 尽量将核心验证逻辑抽象为共享库,例如使用 TypeScript 编写通用验证规则,并在前后端同时引用。这样可以确保验证逻辑的一致性。 2. **自动化测试验证** 使用单元测试和集成测试覆盖验证逻辑。例如在 Node.js 中可以使用 Jest 测试验证函数的行为是否一致: ```javascript const validateEmail = require('./validators').validateEmail; test('validates correct email', () => { expect(validateEmail('test@example.com')).toBe(true); }); test('rejects invalid email', () => { expect(validateEmail('invalid-email')).toBe(false); }); ``` 3. **日志与调试机制** 在后端记录详细的验证失败信息,包括字段名、期望规则和实际值,有助于快速定位问题。例如在 Spring Boot 中可以通过 `@Valid` 注解捕获异常并记录: ```java @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<?> handleValidationExceptions(MethodArgumentNotValidException ex) { Map<String, String> errors = new HashMap<>(); ex.getBindingResult().getAllErrors().forEach((error) -> { String fieldName = ((FieldError) error).getField(); String errorMessage = error.getDefaultMessage(); errors.put(fieldName, errorMessage); }); return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST); } ``` 4. **使用统一数据契约(Data Contract)** 在微服务架构中,建议使用共享的数据契约(如 Protobuf、JSON Schema)来定义数据结构和验证规则,确保服务间交互时数据格式一致。 ### 总结 验证逻辑不匹配问题通常源于开发流程中的协作不畅或技术实现差异。通过统一验证逻辑、加强测试覆盖和日志记录,可以有效减少此类问题的发生。在系统设计阶段就应考虑验证规则的标准化与共享机制,以提升整体系统的健壮性和可维护性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值