一个问题:如果人脸库中有多个人脸,我们要实现增删功能,想一次删除多个底库的时候的应该怎么设计算法?要求原地删除,不改变顺序
最粗暴的方式是每删除一个元素,就将其后面的所有元素向前移动一个索引。但是并不是很科学,移动次数太多造成复杂度极高。
优化思路:为底库的所有元素创建一个新list,这个list可以保存每个元素在完成删除任务后要向前移动几步,再一次性移动。
class MyFaceData():
def __init__(self):
self.data = [None] * 10000 //列表初始化
self.data_cnt = 0 //列表长度
def addSingleFaceData(self, to_add_data): //添加元素的方法(不是重点)
self.data[self.data_cnt] = to_add_data
self.data_cnt += 1
def delSingleFace(self, to_delete_data): //删除单个元素的方法
for index in range(self.data_cnt):
if( self.data[index] == to_delete_data ):
for index2 in range(index, self.data_cnt - 1):
self.data[index2] = self.data[index2+1]
self.data_cnt -= 1
return
def delManyFaceOld(self, to_delete_data_list)://删除多个元素的方法(旧)
for item in to_delete_data_list:
self.delSingleFace(item)
def delManyFace_new(self, to_delete_data_list): //删除多个元素的方法(新)
move_step = 0
for index in range(self.data_cnt):
if(self.data[index] in to_delete_data_list):
move_step += 1
else:
self.data[index - move_step] = self.data[index]
self.data_cnt -= move_step
def __len__(self):
return self.data_cnt
def clear(self):
self.data_cnt = 0
def printFaceData(self):
print("**"*50)
for index in range(self.data_cnt):
print("index:",index," data:",self.data[index])
if __name__ == "__main__":
myFaceData = MyFaceData()
for i in range(10):
myFaceData.addSingleFaceData(i+10)
myFaceData.printFaceData()
myFaceData.delManyFace_new( [15,16,17])
myFaceData.printFaceData()
输出如下:
****************************************************************************************************
index: 0 data: 10
index: 1 data: 11
index: 2 data: 12
index: 3 data: 13
index: 4 data: 14
index: 5 data: 15
index: 6 data: 16
index: 7 data: 17
index: 8 data: 18
index: 9 data: 19
****************************************************************************************************
index: 0 data: 10
index: 1 data: 11
index: 2 data: 12
index: 3 data: 13
index: 4 data: 14
index: 5 data: 18
index: 6 data: 19
move_list值为:
[0, 0, 0, 0, 0, 0, 0, 0, 3, 3]