哪一个更有效率?
我想保留一个项目列表,但是,我需要对列表进行排序
最好是按ID添加列表中的项目,然后按其他人排序,或者只是添加没有订单的项目,并按用户需要的顺序排序?
答案 0 :(得分:2)
如果您真的需要保持列表排序 - 而不是使用其他数据结构来对列表进行排序访问 - 那么您可以简单地创建一个列表,其元素具有针对不同排序条件的不同指针。< / p>
换句话说,不要只保留previous
和next
指针,而是previousById
,nextById
,previousByName
,previousByCredits
和{ {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;
}
我希望,我确实帮到了你。如果你不理解代码中的任何一行,只需对这个“答案”发表评论。