Desut查找法(自创)

查找时复杂度为O(1)的查找法,使用每个数值映射的索引查找,通俗易懂

代码:

typedef struct Desut  
{  
    int _Value[128];  
    int _Virte[128]; // 假设我们只处理0到127之间的值  
    int _Number;  

    int ALL_Number;
   
} Desut;  
  
// 初始化 Desut 结构体的 _Virte 数组为 -1,表示初始时没有值  
void init_desut(Desut *table)  
{  
    for (int i = 0; i < 128; i++) {  
        table->_Virte[i] = -1; // 使用 -1 表示该值尚未在 _Value 中找到  
    }  
    table->_Number = 0;  
    table->ALL_Number = 0;  
}  
  
// 插入值到 _Value 数组,并更新 _Virte 数组以反映新位置  
void insert_desut(Desut *table, int value)  
{  
    if (value < 0 || value >= 128 || table->_Number >= 128) {  
        // 处理错误情况:值超出范围或 _Value 数组已满  
        return;  
    }  
  
    // 更新 _Virte 数组以反映新插入的值的位置  
    table->_Virte[value] = table->_Number; // 存储新位置  (核心代码)
  
    // 插入新值到 _Value 数组  
    table->_Value[table->_Number] = value;  
    table->ALL_Number += value;  
    table->_Number++;
  
    // 注意:这里没有累加到 And 成员,因为我们已经移除了它  
    // 如果您需要这样的功能,可以重新添加它  
}  

int desut_found(struct Desut* table, int value) {  
    if (value < 0 || value >= 128 || table->_Number == 0) {  
        return -1; // 处理错误情况  
    }  
    return table->_Virte[value]; // 直接返回索引,如果它是 -1,则表示未找到  
}
void remove_desut_yesmove(Desut *table, int value)  
{  
    // 首先检查值是否有效  
    if (value < 0 || value >= 128 || table->_Virte[value] == -1) {  
        // 处理错误情况:值超出范围或未找到  
        return;  
    }  

    int index_to_remove = table->_Virte[value];  // 获取要移除的值的索引  

    // 移除该值  
    for (int i = index_to_remove; i < table->_Number - 1; i++) {  
        table->_Value[i] = table->_Value[i + 1]; // 向左移动值  
        table->_Virte[table->_Value[i]] = i; // 更新对应值的索引  
    }  

    // 更新 _Number  
    table->_Number--;  
    table->ALL_Number-=value;  

    // 将移除的值索引设置为 -1  
    table->_Virte[value] = -1;  
}  
void remove_desut_nomove(Desut *table, int value) {  
    if (value < 0 || value >= 128 || table->_Virte[value] == -1) {  
        return; // 处理错误情况  
    }  

    int index_to_remove = table->_Virte[value]; // 获取要移除的值的索引  
    table->_Virte[value] = -1; // 标记该值为已删除  

    // 将要移除的元素替换为最后一个有效元素  
    if (table->_Number > 0 && index_to_remove < table->_Number - 1) {  
        table->_Value[index_to_remove] = table->_Value[table->_Number - 1];  
        table->_Virte[table->_Value[index_to_remove]] = index_to_remove;  
    }  

    // 更新数量  
    table->_Number--;  
    table->ALL_Number -= value; // 减去已删除的值  
}  

可以用,但禁止盗用(不然你连哪里报错都不知道)

使用示例:

int main() {  
    Desut table;  
    init_desut(&table);  

    // 插入值示例  
    insert_desut(&table, 5);  
    insert_desut(&table, 10);  
    insert_desut(&table, 20);  

    // 打印当前状态  
    printf("Values in _Value array: ");  
    for (int i = 0; i < table._Number; i++) {  
        printf("%d ", table._Value[i]);  
    }  
    printf("\n");  

    // 查找一个值  
    int found_index = desut_found(&table, 10);  
    if (found_index != -1) {  
        printf("Value 10 found at index: %d\n", found_index);  
    } else {  
        printf("Value 10 not found.\n");  
    }  

    // 移除一个值  
    remove_desut_yesmove(&table, 10);  
    printf("After removing 10, Values in _Value array: ");  
    for (int i = 0; i < table._Number; i++) {  
        printf("%d ", table._Value[i]);  
    }  
    printf("\n");  

    // 检查移除后的查找  
    found_index = desut_found(&table, 10);  
    if (found_index != -1) {  
        printf("Value 10 found at index: %d\n", found_index);  
    } else {  
        printf("Value 10 not found.\n");  
    }  

    return 0;  
}  

麻烦点个不要钱的赞,帮我上排名。欢迎到评论区里讨论;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值