双链表实现

时间:2011-03-13 14:49:04

标签: c++ data-structures

哪一个更有效率?

我想保留一个项目列表,但是,我需要对列表进行排序

  • by id,
  • 按名称
  • 课程学分
  • 由用户

最好是按ID添加列表中的项目,然后按其他人排序,或者只是添加没有订单的项目,并按用户需要的顺序排序?

5 个答案:

答案 0 :(得分:2)

如果您真的需要保持列表排序 - 而不是使用其他数据结构来对列表进行排序访问 - 那么您可以简单地创建一个列表,其元素具有针对不同排序条件的不同指针。< / p>

换句话说,不要只保留previousnext指针,而是previousByIdnextByIdpreviousByNamepreviousByCredits和{ {1}}。同样,你将有三个头部和/或尾部指针,而不只是一个。

请注意,这种方法的缺点是在实施其他排序标准时不够灵活。我假设你正试图解决一个家庭作业类型的问题,这就是为什么我试图找到似乎是作业要求的答案。

答案 1 :(得分:2)

您可以使用三个地图(或哈希图): 将id映射到项目,将一个映射名称映射到项目引用(或指针),将一个映射课程再次归入项目引用。

答案 2 :(得分:1)

按照您知道最多排序的顺序对它进行排序会更有效率,例如,如果您知道最常通过id检索,请按{排序{ {1}},否则选择其中一个,如果它只是一个整数字段,id将是最简单的

那么为此,您需要检查插入以查找id小于newid但大于nextid的位置,然后使用previousid分配新节点,适当地设置指针。

保持链表以某种方式排序比仅保持未排序更好。你在插入一个项目所需的时间增加了一些时间,但是以特定的方式对它进行排序所需的时间可以忽略不计

答案 3 :(得分:1)

更高效的是按原样存储节点,并使4个不同的索引保持最新。这样,当需要一个订单时,您只需选择正确的索引即可。输入的成本为O(log N),遍历为O(1)。

当然,同时保留4个索引,可能对唯一性有不同的要求,并且面对可能的异常,相对困难,但是,有一个Boost库:Boost MultiIndex

例如,生成一个可以是sorted either by ID or by Name的集合。

由于您可以根据需要添加任意数量的索引,因此它可以让您:)

答案 4 :(得分:0)

以随机顺序将列出的列表对象保留在带衬里的列表中。要按任意键对列表进行排序,请使用此伪代码:

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;
}

我希望,我确实帮到了你。如果你不理解代码中的任何一行,只需对这个“答案”发表评论。