Если вы действительно хотите это сделать, установите флаг в вашей записи.Если вы хотите удалить запись из вашего файла, просто аннулируйте этот флаг ( логическое удаление ) без его физического удаления.В следующий раз, когда вы добавите запись, просто просмотрите файл, найдите первую недействительную запись и перезапишите ее.Если все проверено, добавьте его до конца.O(1)
требуется время для удаления записи и O(n)
для добавления новой записи, при условии, что чтение / запись одной записи с / на диск является основной операцией.
Вы даже можете оптимизировать ее дальше.В начале файла сохраните битовую карту (1
для недействительных).Например, 0001000...
означает, что четвертая запись в вашем файле признана недействительной.Когда вы добавляете запись, ищите первый 1
в битовой карте и используйте Случайный файловый ввод / вывод (в отличие от последовательный файловый ввод / вывод ) чтобы перенаправить указатель файла непосредственно на эту запись для перезаписи.Добавление таким способом занимает всего O(1)
раз.
О, я заметил ваш комментарий.Если вы хотите сделать это эффективно с физически удаленной записью, простой способ состоит в том, чтобы поменять запись на удаление с самой последней в вашем файле и удалить последнюю, при условии, что ваши записи не отсортированы,Время также хорошее, что составляет O(1)
как для добавления, так и для удаления.
Редактировать: Как упоминал Джо, this requires that all of your entries have the same size
.Вы можете реализовать один с переменной длиной записей, но это будет сложнее, чем обсуждаемый здесь.