MarkCG Posted January 16, 2012 Report Share Posted January 16, 2012 (edited) Hi all, In implementing code for machine control from a set of requirements, I found where a the right data structure could make what I thought would be a somewhat complicated task very simple: A data structure that keeps elements (clusters) sorted by one key element (which will be the priority for me), while at the same time keeping elements with equal key values in the same order that they are inserted (that is to say, the sort algorithm is stable). And allows efficient element insertion / deletion. The structure could allow only unique elements or not, in the latter case I could manage it so that only unique elements are inserted. You can use the "sort 1D array" function of an array of clusters, but it will sort taking EVERY element of the cluster into account. Thus elements get moved that I don't want to get moved. Now Tomi Maila put out this community nuggett back in 2007, where he used variants to implement ordered sets: give it an array of clusters, it sorts them according to value starting with cluster element 0 and keeps only unique elements. http://ni.lithium.co...ant/td-p/489967 This would be perfect! Fast, unique elements, ordered. But again, It sorts based on ALL elements in the cluster, again moving elements that I do not want to be moved relative to each other. I need it to sort only on one key value, the priority. I though priority queue, but how can I easily delete elements by name? I imagine it would involve a lot of queue previewing, dequeueing, and requeuing... Now before anyone starts telling me off about needing to start using LVOOP (which I want to), I have a good reason!! The code will have to be able to run on LVRT 8.6 , which does not support LVOOP. The program will have to run in test facilities on the other side of the globe, and I have no control over whether or not they will or can upgrade. So it pays to be conservative. Anyone have any ideas about what I ought to do? I can always write my own, I suppose. Edited January 16, 2012 by Sergeant Manners Quote Link to comment
guentermueller Posted January 16, 2012 Report Share Posted January 16, 2012 I would use this approach. It is fast and reliable. 1 Quote Link to comment
drjdpowell Posted January 16, 2012 Report Share Posted January 16, 2012 How about making your second element of the cluster be an index that increments by one for each cluster added. Then your sort will never change the order except as required by the first cluster element; all other elements will be ignored.. Quote Link to comment
asbo Posted January 16, 2012 Report Share Posted January 16, 2012 I would use this approach. It is fast and reliable. Also, stable, which is pretty important for some sorting applications and particularly OP. How about making your second element of the cluster be an index that increments by one for each cluster added. Then your sort will never change the order except as required by the first cluster element; all other elements will be ignored.. You've missed guentermueller's link. Quote Link to comment
drjdpowell Posted January 16, 2012 Report Share Posted January 16, 2012 You've missed guentermueller's link. Only skimmed it, but I didn’t think the connection between that link, and the problem of ignoring elements other than the first, is all that obvious (though it can be extrapolated). After all, it’s called “Sort 1D array of clusters by the second element”, the opposite of what the OP wants. Nor is it obvious how to adapt it to using a Variant to hold the set. But add a “creation index” as second element and one can use variant attributes as shown in the Maila nugget, which are faster than linear sorting. Quote Link to comment
MarkCG Posted January 17, 2012 Author Report Share Posted January 17, 2012 Ah yes, I think the method guentermueller linked to will work just fine, you can sort by any element you want ... first, second, Nth, ignoring other elements. Basically it's method drdjpowell suggested, and altenback used in that post: How about making your second element of the cluster be an index that increments by one for each cluster added. Then your sort will never change the order except as required by the first cluster element; all other elements will be ignored.. It will also keep elements of the same key value in order of insertion. Perfect... thank you everybody for the suggestions! Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.