查找时复杂度为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;
}
麻烦点个不要钱的赞,帮我上排名。欢迎到评论区里讨论;