有一种数据流其中都是已经分割好的数据块每个块都有属于自己的一个指纹对于每个数据块都有两个指针指向前面一个和后面一个的数据块。假设后一次的数据流中和上一次有同样的数据块时就将相同数据块前后的指纹块也复制到后一次的数据流中用c++写出这段代码。进一步思考在不使用哈希表的情况下怎么完成这个任务。
以下是使用哈希表的代码:
#include
struct DataBlock { int fingerprint; DataBlock* prev; DataBlock* next; };
void copyDuplicateBlocks(DataBlock* head1, DataBlock* head2) { unordered_map<int, DataBlock*> fingerprintMap; DataBlock* node1 = head1->next; while (node1 != nullptr) { fingerprintMap[node1->fingerprint] = node1; node1 = node1->next; } DataBlock* node2 = head2->next; while (node2 != nullptr) { auto it = fingerprintMap.find(node2->fingerprint); if (it != fingerprintMap.end()) { // Found duplicate block DataBlock* duplicateBlock = it->second; DataBlock* prevBlock = duplicateBlock->prev; DataBlock* nextBlock = duplicateBlock->next; DataBlock* newBlock1 = new DataBlock{duplicateBlock->fingerprint, prevBlock, node2}; prevBlock->next = newBlock1; node2->prev = newBlock1; DataBlock* newBlock2 = new DataBlock{duplicateBlock->fingerprint, node2, nextBlock}; node2->next = newBlock2; nextBlock->prev = newBlock2; } node2 = node2->next; } }
int main() { // Build example linked lists DataBlock* head1 = new DataBlock{0, nullptr, nullptr}; DataBlock* node1 = new DataBlock{1, head1, nullptr}; head1->next = node1; DataBlock* node2 = new DataBlock{2, node1, nullptr}; node1->next = node2; DataBlock* node3 = new DataBlock{3, node2, nullptr}; node2->next = node3; DataBlock* head2 = new DataBlock{0, nullptr, nullptr}; DataBlock* node4 = new DataBlock{1, head2, nullptr}; head2->next = node4; DataBlock* node5 = new DataBlock{4, node4, nullptr}; node4->next = node5; DataBlock* node6 = new DataBlock{2, node5, nullptr}; node5->next = node6;
// Copy duplicate blocks
copyDuplicateBlocks(head1, head2);
// Print updated linked list
DataBlock* node = head2->next;
while (node != nullptr) {
cout << node->fingerprint << " ";
node = node->next;
}
cout << endl;
return 0;
}
以下是不使用哈希表的代码:
#include
struct DataBlock { int fingerprint; DataBlock* prev; DataBlock* next; };
void copyDuplicateBlocks(DataBlock* head1, DataBlock* head2) {
vector
int main() { // Build example linked lists DataBlock* head1 = new DataBlock{0, nullptr, nullptr}; DataBlock* node1 = new DataBlock{1, head1, nullptr}; head1->next = node1; DataBlock* node2 = new DataBlock{2, node1, nullptr}; node1->next = node2; DataBlock* node3 = new DataBlock{3, node2, nullptr}; node2->next = node3; DataBlock* head2 = new DataBlock{0, nullptr, nullptr}; DataBlock* node4 = new DataBlock{1, head2, nullptr}; head2->next = node4; DataBlock* node5 = new DataBlock{4, node4, nullptr}; node4->next = node5; DataBlock* node6 = new DataBlock{2, node5, nullptr}; node5->next = node6;
// Copy duplicate blocks
copyDuplicateBlocks(head1, head2);
// Print updated linked list
DataBlock* node = head2->next;
while (node != nullptr) {
cout << node->fingerprint << " ";
node = node->next;
}
cout << endl;
return 0;
原文地址: https://www.cveoy.top/t/topic/fGwy 著作权归作者所有。请勿转载和采集!