【发布时间】:2015-09-14 12:10:25
【问题描述】:
我有两个 Vecs 对应于特征向量列表及其对应的类标签,我想按类标签对它们进行共同排序。
然而,Rust 的 sort_by 在切片上运行,而不是作为 trait(或类似)上的通用函数,并且闭包只获取要比较的元素而不是索引,因此我可以偷偷地破解排序为并行。
我已经考虑过解决方案:
let mut both = data.iter().zip(labels.iter()).collect();
both.sort_by( blah blah );
// Now split them back into two vectors
我不希望每次都分配一个全新的向量来执行此操作,因为数据的大小可能非常大。
当然,我总是可以实现自己的排序,但如果有内置的方法可以做到这一点,那就更好了。
【问题讨论】:
-
@Shepmaster 我将它传递给 libsvm 这要求它们是分开的,所以很遗憾是的。
-
一种最小化分配的方法是只分配一个索引向量(如果你的元素少于 40 亿,它们只需要
u32,所以每个元素 4 个字节)并排序通过sort_by索引到labels。然后可以使用结果将data和labels置换为正确的顺序。 (当然,不幸的是仍然分配 O(n) 内存。) -
sort_by自己不做,你需要自己实现排序,可能以sort_by为基础。哦,它不能只给你索引,因为它们不是恒定的。如果您真的要坚持使用sort_by,则需要进行指针比较以获取切片中元素的索引,然后弄清楚sort_by将如何处理您的响应并将其用于其他向量自己,这将是一种完全疯狂和脆弱的方式。所以,是的,只要看看sort_by做了什么并复制它。 -
请注意,
sort_by已经分配了 2n 个空间,因此除非您使用不同的排序函数,否则您不会避免分配。 -
[T]::sort/sort_by是一个稳定的排序。如果您需要不稳定的非分配排序,在 crates.io 上还有其他选择。
标签: rust