确定性跳跃表(1-2-3跳跃表(SkipList))实现

发布时间:2026/11/5 16:32:48

确定性跳跃表(1-2-3跳跃表(SkipList))实现 所谓1-2-3跳跃表是指跳跃表每一个链接层中两个相邻链接指针之间的下一层节点数只能是12或3.它是一种特殊的跳跃表其操作的时间复杂度可以达到实现C代码如下分为两个版本第一版本中每个节点的所有链接指针用vector容器组织,第二个版本中每个节点的链接指针用list容器组织第一个版本#include iostream #include vector #include deque #include set #include random #include ctime using namespace std; template typename T struct HeadTailNode; template typename T struct NodeInfo { int gap_capacity; HeadTailNodeT* ptr_to_same_level; NodeInfo(const NodeInfoT copy) :gap_capacity(copy.gap_capacity), ptr_to_same_level(copy.ptr_to_same_level) {} NodeInfo() :gap_capacity(0), ptr_to_same_level(nullptr) {} }; template typename T struct HeadTailNode { vectorNodeInfoT post_ptr; virtual ~HeadTailNode() { } HeadTailNode() :post_ptr() {} HeadTailNode(const HeadTailNodeT copy) :post_ptr(copy.post_ptr) {} }; template typename T struct _123SkipListNode : public HeadTailNodeT { T data; _123SkipListNode(const T data) :data(data), HeadTailNodeT() {} ~_123SkipListNode() {} _123SkipListNode(const _123SkipListNode copy) :data(copy.data), HeadTailNodeT(copy) {} }; template typename T _123SkipListNodeT* typeCast(HeadTailNodeT* convert) { return dynamic_cast_123SkipListNodeT*(convert); } template typename T class _123SkipList { public: _123SkipList(); _123SkipListT* copy(); ~_123SkipList(); bool insert(const T key); bool remove(const T key); private: HeadTailNodeT* head; HeadTailNodeT* tail; }; template typename T _123SkipListT* _123SkipListT::copy() { struct Node_pair { HeadTailNodeT* copy; HeadTailNodeT* _new; Node_pair(HeadTailNodeT* c, HeadTailNodeT* _n) :copy(c), _new(_n) {} bool operator(const Node_pair t) const { return copy t.copy; } }; _123SkipListT* new_123_skip_list new _123SkipList(); new_123_skip_list-~_123SkipList(); new_123_skip_list-head new HeadTailNodeT(*head); setNode_pair has_visited; HeadTailNodeT* cur new_123_skip_list-head; for (HeadTailNodeT* run head; run ! tail; run run-post_ptr[0].ptr_to_same_level) { for (size_t i 0; i run-post_ptr.size(); i) { typename setNode_pair::iterator it has_visited.find(Node_pair(run-post_ptr[i].ptr_to_same_level, nullptr)); if (it ! has_visited.end()) { cur-post_ptr[i].ptr_to_same_level it-_new; } else { if (run-post_ptr[i].ptr_to_same_level tail) { cur-post_ptr[i].ptr_to_same_level new HeadTailNodeT(*tail); } else { cur-post_ptr[i].ptr_to_same_level new _123SkipListNodeT(*typeCast(run-post_ptr[i].ptr_to_same_level)); } has_visited.insert(Node_pair(run-post_ptr[i].ptr_to_same_level, cur-post_ptr[i].ptr_to_same_level)); } } cur cur-post_ptr[0].ptr_to_same_level; } new_123_skip_list-tail new_123_skip_list-head-post_ptr.back().ptr_to_same_level; return new_123_skip_list; } template typename T _123SkipListT::~_123SkipList() { while (head-post_ptr[0].ptr_to_same_level ! tail) { HeadTailNodeT* cur head-post_ptr[0].ptr_to_same_level; head-post_ptr[0].ptr_to_same_level cur-post_ptr[0].ptr_to_same_level; delete cur; } delete head; delete tail; } template typename T _123SkipListT::_123SkipList() :head(new HeadTailNodeT()), tail(new HeadTailNodeT()) { head-post_ptr.push_back(NodeInfoT()); head-post_ptr[0].ptr_to_same_level tail; } template typename T void borrowFromLeft(vectorpairHeadTailNodeT*, HeadTailNodeT* borrowing_path, HeadTailNodeT* run, int borrow_point, size_t level) { for (int j borrowing_path.size() - 1; j borrow_point; --j) { borrowing_path[j].second-post_ptr.push_back(borrowing_path[j].first-post_ptr.back()); borrowing_path[j].first-post_ptr.pop_back(); borrowing_path[j].second-post_ptr.back().gap_capacity 1; if (j 0) { run-post_ptr[level - 1].ptr_to_same_level borrowing_path[j].second; run-post_ptr[level - 1].gap_capacity - 1; } else { borrowing_path[j - 1].first-post_ptr[level - 1].ptr_to_same_level borrowing_path[j].second; borrowing_path[j - 1].first-post_ptr[level - 1].gap_capacity - 1; } } } template typename T void borrowFromRight(HeadTailNodeT* cur, HeadTailNodeT* first_level, size_t level) { HeadTailNodeT* pre cur; HeadTailNodeT* post cur-post_ptr[level - 1].ptr_to_same_level; do { HeadTailNodeT* sub post-post_ptr[level - 2].ptr_to_same_level; sub-post_ptr.push_back(post-post_ptr.back()); post-post_ptr.pop_back(); pre-post_ptr[level - 1].ptr_to_same_level sub; sub-post_ptr.back().gap_capacity - 1; pre-post_ptr[level - 1].gap_capacity 1; pre sub; post sub-post_ptr[level - 1].ptr_to_same_level; } while (post ! first_level); } template typename T HeadTailNodeT* Find(HeadTailNodeT* run, size_t level) { while (run-post_ptr[level - 2].ptr_to_same_level-post_ptr.size() ! level) { run run-post_ptr[level - 2].ptr_to_same_level; } return run; } template typename T bool _123SkipListT::remove(const T key) { if (head-post_ptr.size() 1) { return false; } size_t level head-post_ptr.size(); HeadTailNodeT* run head; vectorHeadTailNodeT* list(head-post_ptr.size(), nullptr); for (; level 1; --level) { while (run-post_ptr[level - 1].ptr_to_same_level ! tail typeCast(run-post_ptr[level - 1].ptr_to_same_level)-data key) { run run-post_ptr[level - 1].ptr_to_same_level; } list[level - 1] run; } HeadTailNodeT* cur run-post_ptr[0].ptr_to_same_level; if (cur tail || typeCast(cur)-data ! key) { return false; } if (cur-post_ptr.size() 2) { _123SkipListNodeT* _deleted typeCast(cur-post_ptr[0].ptr_to_same_level); typeCast(cur)-data _deleted-data; cur-post_ptr[0].ptr_to_same_level _deleted-post_ptr[0].ptr_to_same_level; delete _deleted; --(cur-post_ptr[1].gap_capacity); } else { run-post_ptr[0].ptr_to_same_level cur-post_ptr[0].ptr_to_same_level; delete typeCast(cur); --(list[1]-post_ptr[1].gap_capacity); cur list[1]; } size_t _size head-post_ptr.size(); for (level 2; level _size; level) { if (cur-post_ptr[level - 1].gap_capacity ! 0) { break; } if (cur-post_ptr.size() level) { HeadTailNodeT* first_level cur-post_ptr[level - 1].ptr_to_same_level; while (first_level ! cur-post_ptr[level].ptr_to_same_level) { if (first_level-post_ptr[level - 1].gap_capacity 2) { break; } first_level first_level-post_ptr[level - 1].ptr_to_same_level; } if (first_level cur-post_ptr[level].ptr_to_same_level) { first_level cur-post_ptr[level - 1].ptr_to_same_level; cur-post_ptr[level - 1].ptr_to_same_level first_level-post_ptr[level - 1].ptr_to_same_level; first_level-post_ptr.pop_back(); cur-post_ptr[level - 1].gap_capacity 2; cur-post_ptr[level].gap_capacity - 1; if (cur-post_ptr[level].gap_capacity ! 0) { break; } } else { borrowFromRight(cur, first_level-post_ptr[level - 1].ptr_to_same_level, level); break; } } else { if (level _size) { head-post_ptr.pop_back(); break; } else { HeadTailNodeT* post cur-post_ptr[level - 1].ptr_to_same_level; run list[level]; vectorpairHeadTailNodeT*, HeadTailNodeT* borrowing_path; //(借补过程中高度降一的节点高度增一节点) if (post tail || post-post_ptr.size() level) { while (run ! cur) { run Find(run, level); borrowing_path.push_back({ run-post_ptr[level - 2].ptr_to_same_level , run }); run run-post_ptr[level - 2].ptr_to_same_level; } run list[level]; int i borrowing_path.size() - 1; for (; i 0; --i) { if (i 0) { if (run-post_ptr[level - 1].gap_capacity 2) { break; } } else { if (borrowing_path[i - 1].first-post_ptr[level - 1].gap_capacity 2) { break; } } } if (i 0) { cur-post_ptr.pop_back(); if (borrowing_path.size() 1) { run-post_ptr[level - 1].ptr_to_same_level post; run-post_ptr[level - 1].gap_capacity 1; } else { borrowing_path[borrowing_path.size() - 2].first-post_ptr[level - 1].ptr_to_same_level post; borrowing_path[borrowing_path.size() - 2].first-post_ptr[level - 1].gap_capacity 1; } run-post_ptr[level].gap_capacity - 1; if (run-post_ptr[level].gap_capacity ! 0) { break; } cur run; } else { borrowFromLeft(borrowing_path, run, i, level); break; } } else { { int borrow_point; if (run-post_ptr[level - 1].ptr_to_same_level ! cur) { HeadTailNodeT* _first run-post_ptr[level - 1].ptr_to_same_level; if (_first-post_ptr[level - 1].gap_capacity 2) { _first Find(_first, level); borrowing_path.push_back({ run-post_ptr[level - 1].ptr_to_same_level, nullptr }); borrowing_path.push_back({ cur , _first }); borrow_point 1; } else if (run-post_ptr[level - 1].gap_capacity 2) { HeadTailNodeT* temp Find(run, level); borrowing_path.push_back({ _first, temp }); temp Find(_first, level); borrowing_path.push_back({ cur , temp }); borrow_point 0; } } else { if (run-post_ptr[level - 1].gap_capacity 2) { HeadTailNodeT* temp Find(run, level); borrowing_path.push_back({ cur, temp }); borrow_point 0; } } if (borrowing_path.empty() false) { borrowFromLeft(borrowing_path, run, borrow_point, level); break; } } { HeadTailNodeT* borrow_point nullptr; if (post-post_ptr[level - 1].ptr_to_same_level ! run-post_ptr[level].ptr_to_same_level) { if (post-post_ptr[level - 1].gap_capacity 2) { borrow_point post-post_ptr[level - 1].ptr_to_same_level; } else { HeadTailNodeT* temp post-post_ptr[level - 1].ptr_to_same_level; if (temp-post_ptr[level - 1].gap_capacity 2) { borrow_point temp-post_ptr[level - 1].ptr_to_same_level; } } } else { if (post-post_ptr[level - 1].gap_capacity 2) { borrow_point run-post_ptr[level].ptr_to_same_level; } } if (borrow_point ! nullptr) { borrowFromRight(cur, borrow_point, level); break; } cur-post_ptr.back().ptr_to_same_level post-post_ptr.back().ptr_to_same_level; post-post_ptr.pop_back(); cur-post_ptr.back().gap_capacity 2; run-post_ptr[level].gap_capacity - 1; if (run-post_ptr[level].gap_capacity ! 0) { break; } cur run; } } } } } return true; } template typename T bool _123SkipListT::insert(const T key) { if (head-post_ptr.size() 1) { head-post_ptr.push_back(NodeInfoT()); head-post_ptr[1].ptr_to_same_level tail; head-post_ptr[1].gap_capacity 1; HeadTailNodeT* _new new _123SkipListNodeT(key); _new-post_ptr.push_back(NodeInfoT()); _new-post_ptr[0].ptr_to_same_level tail; head-post_ptr[0].ptr_to_same_level _new; return true; } int level head-post_ptr.size(); int original_level head-post_ptr.size(); HeadTailNodeT* run head; HeadTailNodeT* pre_level nullptr; for (; level 1; --level) { while (run-post_ptr[level - 1].ptr_to_same_level ! tail typeCast(run-post_ptr[level - 1].ptr_to_same_level)-data key) { run run-post_ptr[level - 1].ptr_to_same_level; } if (level ! 1) { if (run-post_ptr[level - 1].gap_capacity 3) { if (level original_level) { pre_level head; run-post_ptr.push_back(NodeInfoT()); run-post_ptr.back().ptr_to_same_level tail; } HeadTailNodeT* mid run-post_ptr[level - 2].ptr_to_same_level-post_ptr[level - 2].ptr_to_same_level; mid-post_ptr.push_back(NodeInfoT()); mid-post_ptr.back().ptr_to_same_level run-post_ptr[level - 1].ptr_to_same_level; run-post_ptr[level - 1].ptr_to_same_level mid; mid-post_ptr.back().gap_capacity 1; run-post_ptr[level - 1].gap_capacity 1; pre_level-post_ptr[level].gap_capacity 1; if (key typeCast(run-post_ptr[level - 1].ptr_to_same_level)-data) { run run-post_ptr[level - 1].ptr_to_same_level; } } pre_level run; } else { if (run-post_ptr[0].ptr_to_same_level tail || typeCast(run-post_ptr[0].ptr_to_same_level)-data ! key) { HeadTailNodeT* _new new _123SkipListNodeT(key); _new-post_ptr.push_back(NodeInfoT()); _new-post_ptr[0].ptr_to_same_level run-post_ptr[0].ptr_to_same_level; run-post_ptr[0].ptr_to_same_level _new; pre_level-post_ptr[1].gap_capacity 1; } else { return false; } } } return true; } int main() { const int N 2000; _123SkipListint g; //vectorint input{34, 12, 9, 23, 56, 11, 6, 67}; vectorint input; for (int i 1; i N; i) { input.push_back(i); } shuffle(input.begin(), input.end(), default_random_engine(time(nullptr))); for (const int run : input) { cout 插入 run endl; if (g.insert(run)) { cout 插入成功 endl; } else { cout 插入失败 endl; } } _123SkipListint* copy g.copy(); for (const int run : input) { cout 删除 run endl; if (copy-remove(run)) { cout 删除成功 endl; } else { cout 删除失败 endl; } } delete copy; return 0; }第二个版本:#include iostream #include vector #include deque #include set #include random #include ctime #include list #include algorithm using namespace std; template typename T struct HeadTailNode; template typename T struct NodeInfo { int gap_capacity; HeadTailNodeT* ptr_to_same_level; NodeInfo(const NodeInfoT copy) :gap_capacity(copy.gap_capacity), ptr_to_same_level(copy.ptr_to_same_level) {} NodeInfo() :gap_capacity(0), ptr_to_same_level(nullptr) {} }; template typename T struct HeadTailNode { listNodeInfoT post_ptr; virtual ~HeadTailNode() {} HeadTailNode() :post_ptr() {} HeadTailNode(const HeadTailNodeT copy) :post_ptr(copy.post_ptr) {} }; template typename T struct _123SkipListNode : public HeadTailNodeT { T data; _123SkipListNode(const T data) :data(data), HeadTailNodeT() {} ~_123SkipListNode() {} _123SkipListNode(const _123SkipListNode copy) :data(copy.data), HeadTailNodeT(copy) {} }; template typename T struct ListNode { typename listNodeInfoT::iterator cur_level_pos; HeadTailNodeT* cur_level_ptr nullptr; ListNode() default; }; template typename T _123SkipListNodeT* typeCast(HeadTailNodeT* convert) { return dynamic_cast_123SkipListNodeT*(convert); } template typename T class _123SkipList { public: _123SkipList(); _123SkipListT* copy(); ~_123SkipList(); bool insert(const T key); bool remove(const T key); private: HeadTailNodeT* head; HeadTailNodeT* tail; }; template typename T _123SkipListT* _123SkipListT::copy() { struct Node_pair { HeadTailNodeT* copy; HeadTailNodeT* _new; Node_pair(HeadTailNodeT* c, HeadTailNodeT* _n) :copy(c), _new(_n) {} bool operator(const Node_pair t) const { return copy t.copy; } }; _123SkipListT* new_123_skip_list new _123SkipList(); new_123_skip_list-~_123SkipList(); new_123_skip_list-head new HeadTailNodeT(*head); setNode_pair has_visited; HeadTailNodeT* cur new_123_skip_list-head; for (HeadTailNodeT* run head; run ! tail; run run-post_ptr.begin()-ptr_to_same_level) { for (typename listNodeInfoT::iterator cur_it cur-post_ptr.begin(), it run-post_ptr.begin(); it ! run-post_ptr.end(); it, cur_it) { typename setNode_pair::iterator temp has_visited.find(Node_pair(it-ptr_to_same_level, nullptr)); if (temp ! has_visited.end()) { cur_it-ptr_to_same_level temp-_new; } else { if (it-ptr_to_same_level tail) { cur_it-ptr_to_same_level new HeadTailNodeT(*tail); } else { cur_it-ptr_to_same_level new _123SkipListNodeT(*typeCast(it-ptr_to_same_level)); } has_visited.insert(Node_pair(it-ptr_to_same_level, cur_it-ptr_to_same_level)); } } cur cur-post_ptr.begin()-ptr_to_same_level; } new_123_skip_list-tail new_123_skip_list-head-post_ptr.back().ptr_to_same_level; return new_123_skip_list; } template typename T _123SkipListT::~_123SkipList() { while (head-post_ptr.front().ptr_to_same_level ! tail) { HeadTailNodeT* cur head-post_ptr.front().ptr_to_same_level; head-post_ptr.front().ptr_to_same_level cur-post_ptr.front().ptr_to_same_level; delete cur; } delete head; delete tail; } template typename T _123SkipListT::_123SkipList() :head(new HeadTailNodeT()), tail(new HeadTailNodeT()) { head-post_ptr.push_back(NodeInfoT()); head-post_ptr.back().ptr_to_same_level tail; } template typename T typename listNodeInfoT::iterator next(typename listNodeInfoT::iterator it) { return it; } template typename T typename listNodeInfoT::iterator _pre(typename listNodeInfoT::iterator it) { return --it; } template typename T void borrowFromLeft(vectorpairHeadTailNodeT*, HeadTailNodeT* borrowing_path, typename listNodeInfoT::iterator it, int borrow_point) { for (int j borrowing_path.size() - 1; j borrow_point; --j) { borrowing_path[j].second-post_ptr.push_back(borrowing_path[j].first-post_ptr.back()); borrowing_path[j].first-post_ptr.pop_back(); borrowing_path[j].second-post_ptr.back().gap_capacity 1; if (j 0) { it-ptr_to_same_level borrowing_path[j].second; it-gap_capacity - 1; } else { borrowing_path[j - 1].first-post_ptr.back().ptr_to_same_level borrowing_path[j].second; borrowing_path[j - 1].first-post_ptr.back().gap_capacity - 1; } } } template typename T void borrowFromRight(typename listNodeInfoT::iterator it, HeadTailNodeT* first_level) { HeadTailNodeT* post it-ptr_to_same_level; do { HeadTailNodeT* sub _preT(_preT(post-post_ptr.end()))-ptr_to_same_level; sub-post_ptr.push_back(post-post_ptr.back()); post-post_ptr.pop_back(); it-ptr_to_same_level sub; sub-post_ptr.back().gap_capacity - 1; it-gap_capacity 1; it _preT(sub-post_ptr.end()); post it-ptr_to_same_level; } while (post ! first_level); } template typename T HeadTailNodeT* Find(typename listNodeInfoT::iterator it, size_t level) { HeadTailNodeT* run nullptr; while (it-ptr_to_same_level-post_ptr.size() ! level) { run it-ptr_to_same_level; it --run-post_ptr.end(); } return run; } template typename T bool _123SkipListT::remove(const T key) { if (head-post_ptr.size() 1) { return false; } size_t level head-post_ptr.size(); HeadTailNodeT* run head; typename listNodeInfoT::iterator run_it --head-post_ptr.end(); vectorListNodeT list(head-post_ptr.size()); for (; level 1; --level) { while (run_it-ptr_to_same_level ! tail typeCast(run_it-ptr_to_same_level)-data key) { run run_it-ptr_to_same_level; run_it --run-post_ptr.end(); } list[level - 1].cur_level_ptr run; list[level - 1].cur_level_pos run_it; if (level ! 1) { --run_it; } } HeadTailNodeT* cur run-post_ptr.begin()-ptr_to_same_level; if (cur tail || typeCast(cur)-data ! key) { return false; } if (cur-post_ptr.size() 2) { _123SkipListNodeT* _deleted typeCast(cur-post_ptr.begin()-ptr_to_same_level); typeCast(cur)-data _deleted-data; cur-post_ptr.begin()-ptr_to_same_level _deleted-post_ptr.begin()-ptr_to_same_level; delete _deleted; --(((cur-post_ptr.begin()))-gap_capacity); } else { run-post_ptr.begin()-ptr_to_same_level cur-post_ptr.begin()-ptr_to_same_level; delete typeCast(cur); --(list[1].cur_level_pos-gap_capacity); cur list[1].cur_level_ptr; } run_it cur-post_ptr.begin(); run cur; size_t _size head-post_ptr.size(); for (level 2; level _size; level) { if (run-post_ptr.end() run_it) { run_it list[level - 1].cur_level_pos; } if (run_it-gap_capacity ! 0) { break; } if (cur-post_ptr.size() level) { HeadTailNodeT* first_level run_it-ptr_to_same_level; run_it; while (first_level ! run_it-ptr_to_same_level) { if ((--first_level-post_ptr.end())-gap_capacity 2) { break; } first_level (--first_level-post_ptr.end())-ptr_to_same_level; } if (first_level run_it-ptr_to_same_level) { --run_it; first_level run_it-ptr_to_same_level; run_it-ptr_to_same_level (--first_level-post_ptr.end())-ptr_to_same_level; first_level-post_ptr.pop_back(); run_it-gap_capacity 2; next(run_it)-gap_capacity - 1; if (next(run_it)-gap_capacity ! 0) { break; } run cur; } else { --run_it; borrowFromRight(run_it, first_level-post_ptr.back().ptr_to_same_level); break; } } else { if (level _size) { head-post_ptr.pop_back(); break; } else { HeadTailNodeT* post run_it-ptr_to_same_level; run list[level].cur_level_ptr; vectorpairHeadTailNodeT*, HeadTailNodeT* borrowing_path; //(借补过程中高度降一的节点高度增一节点) typename std::listNodeInfoT::iterator _it list[level].cur_level_pos; if (post tail || post-post_ptr.size() level) { _it _preT(_preT(_it)); while (run ! cur) { run FindT(_it, level); borrowing_path.push_back({ run-post_ptr.back().ptr_to_same_level , run }); run run-post_ptr.back().ptr_to_same_level; _it _preT(_preT(run-post_ptr.end())); } run list[level].cur_level_ptr; _it _preT(list[level].cur_level_pos); int i borrowing_path.size() - 1; for (; i 0; --i) { if (i 0) { if (_it-gap_capacity 2) { break; } } else { if (borrowing_path[i - 1].first-post_ptr.back().gap_capacity 2) { break; } } } if (i 0) { --run_it; cur-post_ptr.pop_back(); if (borrowing_path.size() 1) { _it-ptr_to_same_level post; _it-gap_capacity 1; } else { borrowing_path[borrowing_path.size() - 2].first-post_ptr.back().ptr_to_same_level post; borrowing_path[borrowing_path.size() - 2].first-post_ptr.back().gap_capacity 1; } _it; _it-gap_capacity - 1; if (_it-gap_capacity ! 0) { break; } swap(cur, run); } else { borrowFromLeft(borrowing_path, _it, i); break; } } else { { int borrow_point; --_it; if (_it-ptr_to_same_level ! cur) { HeadTailNodeT* _first _it-ptr_to_same_level; if (_first-post_ptr.back().gap_capacity 2) { _first FindT(_preT(_preT(_first-post_ptr.end())), level); borrowing_path.push_back({ _it-ptr_to_same_level, nullptr }); borrowing_path.push_back({ cur , _first }); borrow_point 1; } else if (_it-gap_capacity 2) { HeadTailNodeT* temp FindT(_preT(_it), level); borrowing_path.push_back({ _first, temp }); temp FindT(_preT(_preT(_first-post_ptr.end())), level); borrowing_path.push_back({ cur , temp }); borrow_point 0; } } else { if (_it-gap_capacity 2) { HeadTailNodeT* temp FindT(_preT(_it), level); borrowing_path.push_back({ cur, temp }); borrow_point 0; } } if (borrowing_path.empty() false) { borrowFromLeft(borrowing_path, _it, borrow_point); break; } } { _it; HeadTailNodeT* borrow_point nullptr; if (post-post_ptr.back().ptr_to_same_level ! _it-ptr_to_same_level) { if (post-post_ptr.back().gap_capacity 2) { borrow_point post-post_ptr.back().ptr_to_same_level; } else { HeadTailNodeT* temp post-post_ptr.back().ptr_to_same_level; if (temp-post_ptr.back().gap_capacity 2) { borrow_point temp-post_ptr.back().ptr_to_same_level; } } } else { if (post-post_ptr.back().gap_capacity 2) { borrow_point _it-ptr_to_same_level; } } if (borrow_point ! nullptr) { borrowFromRight(run_it, borrow_point); break; } cur-post_ptr.back().ptr_to_same_level post-post_ptr.back().ptr_to_same_level; post-post_ptr.pop_back(); cur-post_ptr.back().gap_capacity 2; _it-gap_capacity - 1; if (_it-gap_capacity ! 0) { break; } swap(cur, run); } } } } run_it; } return true; } template typename T bool _123SkipListT::insert(const T key) { if (head-post_ptr.size() 1) { head-post_ptr.push_back(NodeInfoT()); head-post_ptr.back().ptr_to_same_level tail; head-post_ptr.back().gap_capacity 1; HeadTailNodeT* _new new _123SkipListNodeT(key); _new-post_ptr.push_back(NodeInfoT()); _new-post_ptr.begin()-ptr_to_same_level tail; head-post_ptr.begin()-ptr_to_same_level _new; return true; } int level head-post_ptr.size(); int original_level head-post_ptr.size(); HeadTailNodeT* run head; typename listNodeInfoT::iterator run_it --head-post_ptr.end(); typename listNodeInfoT::iterator pre_run_it; for (; level 1; --level) { while (run_it-ptr_to_same_level ! tail typeCast(run_it-ptr_to_same_level)-data key) { run run_it-ptr_to_same_level; run_it --run-post_ptr.end(); } if (level ! 1) { if (run_it-gap_capacity 3) { if (level original_level) { run-post_ptr.push_back(NodeInfoT()); run-post_ptr.back().ptr_to_same_level tail; pre_run_it --run-post_ptr.end(); } HeadTailNodeT* mid _preT(run_it)-ptr_to_same_level; mid mid-post_ptr.back().ptr_to_same_level; mid-post_ptr.push_back(NodeInfoT()); mid-post_ptr.back().ptr_to_same_level run_it-ptr_to_same_level; run_it-ptr_to_same_level mid; mid-post_ptr.back().gap_capacity 1; run_it-gap_capacity 1; pre_run_it-gap_capacity 1; if (key typeCast(mid)-data) { run mid; run_it --run-post_ptr.end(); } } pre_run_it run_it; --run_it; } else { if (run-post_ptr.begin()-ptr_to_same_level tail || typeCast(run-post_ptr.begin()-ptr_to_same_level)-data ! key) { HeadTailNodeT* _new new _123SkipListNodeT(key); _new-post_ptr.push_back(NodeInfoT()); _new-post_ptr.back().ptr_to_same_level run-post_ptr.begin()-ptr_to_same_level; run-post_ptr.begin()-ptr_to_same_level _new; pre_run_it-gap_capacity 1; } else { return false; } } } return true; } int main() { const int N 2000; _123SkipListint g; //vectorint input{34, 12, 9, 23, 56, 11, 6, 67}; vectorint input; for (int i 1; i N; i) { input.push_back(i); } shuffle(input.begin(), input.end(), default_random_engine(time(nullptr))); for (const int run : input) { cout 插入 run endl; if (g.insert(run)) { cout 插入成功 endl; } else { cout 插入失败 endl; } } _123SkipListint* copy g.copy(); for (const int run : input) { cout 删除 run endl; if (copy-remove(run)) { cout 删除成功 endl; } else { cout 删除失败 endl; } } delete copy; return 0; }
延伸阅读

更多相关文章

2026/11/4 19:29:09

STM32四旋翼飞控系统设计:从硬件选型到PID调参实战

简介:基于STM32的四旋翼飞行控制系统毕业设计文档,是一份面向高校自动化、电子及嵌入式方向学生的完整设计报告,适合用于毕业设计选题、方案论证与系统开发参考。压缩包内含1个doc文档,体积35.48MB,规模适中&#xff0…

2026/10/30 11:15:36

生成所有错位排列的算法

所谓N元错位排列,就是指对应于1,2,–,N的N元排列Im(m1,2,—,N),满足Im!m,算法的目的是构造出所有这样的错位排列,依据的基本思想是回溯法,在沿栈向下试探的过程中逐步扩大部分错位排列的规模,当发现无法找到下一个部分…

2026/11/4 16:12:52

试解2014ACM大赛赛题守望者逃离荒岛问题

题目如下:恶魔猎手尤迫安野心勃勃.他背叛了暗夜精灵,率深藏在海底的那加企图叛变:守望者在与尤迪安的交锋中遭遇了围杀.被困在一个荒芜的大岛上。为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去&#…

2026/11/5 16:26:13

Rust原来很简单二:所有权系统

Part 2 核心篇 —— 所有权系统 本篇覆盖 第 6 ~ 10 章:所有权、借用与引用、生命周期、字符串与切片、内存模型。 ⚠️ 这是全书最重要的一篇。 把它吃透,Rust 从此“很简单”;跳过它,你会处处碰壁。请慢下来,动手敲每一段代码。 第 6 章 所有权:Rust 的第一性原理 6…

2026/11/5 15:00:49

基于Hadoop+Spark的民宿智能推荐系统设计与实现

1. 项目概述:大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈,构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师,我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享…

2026/11/5 14:10:30

ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 14:10:30

UART接口24位ADC搭配RS485,解决远距离温度监控难题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 14:10:30

UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 13:55:19

GD32E10x官方例程入门:从GPIO点灯到串口调试

简介:这份GD32E10x系列官方例程面向嵌入式硬件与单片机开发者,基于ARM Cortex-M3内核,汇集兆易创新GD32E10x的示例代码,适合工业控制、消费电子、通信设备等场景的学习、验证与二次开发。压缩包共935个文件,约11.16MB&…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑