《机器学习实战》程序4-5报错

报错:TypeError: ‘range’ object doesn’t support item deletion

解决办法:将trainingSet的数据类型改为‘list’,即trainingSet=list(range(50))

这里给出最佳适应算法的实现代码,并附有注释: ``` // 定义一个结构体表示一个分区 struct Partition { int startAddr; // 分区起始地址 int endAddr; // 分区结束地址 int size; // 分区大小 bool isFree; // 是否空闲 }; // 定义一个动态数组来保存所有分区 vector<Partition> partitions; // 分配内存的函数 int allocateMemory(int size) { int minSize = INT_MAX; // 初始化最小分区大小为一个极大值 int index = -1; // 初始化最小分区的下标为-1 // 遍历所有分区,找到大小大于等于所需大小且最小的空闲分区 for (int i = 0; i < partitions.size(); i++) { if (partitions[i].isFree && partitions[i].size >= size && partitions[i].size < minSize) { minSize = partitions[i].size; index = i; } } // 如果找到了合适的分区,则进行分配 if (index != -1) { int startAddr = partitions[index].startAddr; // 分配起始地址 partitions[index].startAddr += size; // 更新分区起始地址 partitions[index].size -= size; // 更新分区大小 if (partitions[index].size == 0) { partitions[index].isFree = false; // 如果分区大小为0,说明已被完全占用,将其标记为不可用 } return startAddr; } else { return -1; // 找不到合适的分区,分配失败 } } // 回收内存的函数 void freeMemory(int startAddr) { // 遍历所有分区,找到起始地址等于给定地址的分区 for (int i = 0; i < partitions.size(); i++) { if (partitions[i].startAddr == startAddr) { partitions[i].isFree = true; // 将该分区标记为空闲 // 如果该分区前后都是空闲分区,则将它们合并 if (i > 0 && partitions[i-1].isFree) { partitions[i].startAddr = partitions[i-1].startAddr; // 更新合并后的分区的起始地址 partitions[i].size += partitions[i-1].size; // 更新合并后的分区的大小 partitions.erase(partitions.begin() + i - 1); // 删除被合并的前一个分区 i--; } if (i < partitions.size() - 1 && partitions[i+1].isFree) { partitions[i].endAddr = partitions[i+1].endAddr; // 更新合并后的分区的结束地址 partitions[i].size += partitions[i+1].size; // 更新合并后的分区的大小 partitions.erase(partitions.begin() + i + 1); // 删除被合并的后一个分区 } break; } } } ``` 数据结构分析: 本算法使用一个动态数组来保存所有分区,每个分区用一个结构体来表示。结构体包含分区的起始地址、结束地址、大小和是否空闲等属性。 算法分析: 最佳适应算法是一种动态分配内存的算法,它会在所有空闲分区中找到大小最接近所需内存大小的分区来进行分配。分配完成后,如果分配后的分区大小为0,则将该分区标记为不可用。回收内存时,会将被释放的分区标记为空闲,并检查前后是否有空闲分区可以与其合并。 算法分析流程图: ![最佳适应算法流程图](https://img-blog.csdnimg.cn/20211109111230796.png)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值