簡體   English   中英

雙鏈表實現

[英]doubly linked list implementation

哪一個效率更高?

我想保留一個項目列表,但是我需要對列表進行排序

  • 根據ID,
  • 按名字
  • 按課程學分
  • 由用戶

最好按ID在列表中添加項目,然后按其他項目排序,還是僅按順序添加項目,而無需在用戶需要時按所需的順序排序?

如果確實需要對列表進行排序(而不是使用其他數據結構來對列表進行排序訪問),則可以簡單地創建一個列表,其元素針對不同的排序標准具有不同的指針。

換句話說,不是僅保留上previousnext指針,而是要具有previousByIdnextByIdpreviousByNamepreviousByCreditsnextByCredits 同樣,您將擁有三個頭和/或尾指針,而不僅僅是一個。

請注意,這種方法的缺點是在實現其他排序標准時不靈活。 我假設您正在嘗試解決作業類型的問題,這就是為什么我嘗試針對似乎是作業要求的問題量身定制答案的原因。

您可以使用三種映射(或哈希映射):一種將ID映射到項目,一種將名稱映射到項目引用(或指針),另一種將課程學分映射到項目引用。

按您知道的排序順序最高的順序進行排序會更有效,例如,如果您知道您將最常按id進行檢索,請按id對其進行排序,否則請選擇其中一個如果id只是一個整數字段,則id是最簡單的

那么接下來要做到這一點,你會檢查插入發現其中newid小於nextid但大於previousid ,然后分配一個新的節點new和設置適當的指針。

以某種方式對鏈表進行排序要比不對鏈表進行排序更好。 您在插入項目所需的時間上增加了一些時間,但是以某種特定方式對其進行排序所需的時間可以忽略不計

更有效率的是按原樣存儲節點,並保持4個不同的索引為最新。 這樣,當需要一個訂單時,您只需要選擇正確的索引即可。 輸入的成本為O(log N),遍歷的成本為O(1)。

當然,要同時保持4個索引(對唯一性的要求可能不同,並且面對可能的異常)是相對困難的,但是,這里有一個Boost庫: Boost MultiIndex

例如,生成一個可以按ID或Name排序的集合。

由於您可以根據需要添加任意數量的索引,因此應該可以進行:)

將襯里列表對象以隨機順序保留在襯里列表中。 要使用任何鍵對列表進行排序,請使用以下偽代碼:

struct LinkedList {
    string name;
    LinkedList *prev;
    LinkedList *next;
};

void FillArray(LinkedList *first, LinkedList **output, size_t &size) {
    //function creates an array of pointers to every LinkedList object
    LinedList *now;
    size_t i; //you may use int instead of size_t

    //check, how many objects are there in linked list
    now=first;
    while(now!=NULL) {
        size++;
        now=now->next;
    }

    //if linked list is empty
    if (size==0) {
        *output=NULL;
        return;
    }

    //create the array;
    *output = new LinkedList[size];

    //fill the array
    i=0;
    now=first;
    while(now!=NULL) {
        *output[i++]=now;
        now=now->next;
    }
}

SortByName(LinkedList *arrayOfPointers, size_t size) {
    // your function to sort by name here
}

void TemporatorySort(LinkedList *first, LinkedList **output, size_t &size) {
    // this function will create the array of pointer to your linked list,
    // sort this array, and return the sorted array. However, the linked
    // list will stay as it is. It's good for example when your lined list
    // is sorted by ID, but you need to print it sorted by names only once.
    FillArray(first, *output, size);
    SortByName(output,size);
}

void PermanentSort(LinkedList *first) {
    // This function will sort the linked list and save the new order
    // permanently.
    LinkedList *sorted;
    size_t size;
    TemporatorySort(first,&sorted,size);
    if (size>0) {
        sorted[0].prev=NULL;
    }
    for(int i=1;i<size;i++) {
        sorted[i-1].next=sorted[i];
        sorted[i].prev=sorted[i-1];
    }
    sorted[size-1].next=NULL;
}

希望我確實對您有所幫助。 如果您不理解代碼中的任何一行,只需在此“答案”中添加注釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM