天道酬勤,学无止境

sortedset

SortedSet<>.Contains() how to implement own comparation?

I want to check if Object with given values exists in SortedSet<> but I don't understand how custom comparation works here. In List<>.Exists() i could just use lambda, but I cannot do that there and i don't get that whole interface thing while msdn says i need to override int returning function. public class Node { public int X, Y; public int rand; public Node(int x, int y, int r) { X = x; Y = y; rand = r; } } class Program { static void Main(string[] args) { SortedSet<Node> mySet = new SortedSet<Node>(); mySet.Add(new Node(1, 2, 90)); Node myNode = new Node(1, 2, 50); // I want this to check

2021-11-26 13:37:15    分类:问答    c#   sortedset

C# fastest intersection of 2 sets of sorted numbers

I'm calculating intersection of 2 sets of sorted numbers in a time-critical part of my application. This calculation is the biggest bottleneck of the whole application so I need to speed it up. I've tried a bunch of simple options and am currently using this: foreach (var index in firstSet) { if (secondSet.BinarySearch(index) < 0) continue; //do stuff } Both firstSet and secondSet are of type List. I've also tried using LINQ: var intersection = firstSet.Where(t => secondSet.BinarySearch(t) >= 0).ToList(); and then looping through intersection. But as both of these sets are sorted I feel there

2021-11-21 08:26:15    分类:问答    c#   .net   intersection   sortedset

ZRANGESTORE prior Redis 6.2.0

Basically I would like to store the top 5 from a sorted set in different set. In redis 6.2 I can do it with ZRANGESTORE with REV option. What is the alternative in lower versions?

2021-11-12 15:58:56    分类:问答    redis   sortedset

Redis 如何根据两个不同的排序集进行排序?(How can Redis sort according to two different sorted sets?)

问题 我有两个不同的排序集。 一种是编辑器 ID: article_id editor_id 101 10 102 11 103 10 104 10 另一个排序集用于日期排序: article_id day 101 29 102 27 103 25 104 27 我想合并这些显示第一个编辑器第二天排序状态的集合。 我应该使用哪些命令? 回答1 假设article_id是您的成员值,并且editor_id / day是相应排序集中的分数,并且假设每个article_id都存在于两个排序集中,您可以执行以下操作: ZINTERSTORE t 2 k1 k2 WEIGHTS 100 1 AGGREGATE SUM 解释: t是保存结果的临时键 k1是存储editor_id的 Sorted Set k2是存储day的 Sorted Set 权重 100 将editor_id乘以 100(即“向右移动”两个位置) AGGREGATE SUM结果如下: editor_id * 100 + day 笔记: 您可以使用ZUNIONSTORE来代替相同的结果重量 100 的使用假定day是一个 2 位数的值

2021-11-09 06:37:11    分类:技术分享    redis   sortedset

How can Redis sort according to two different sorted sets?

I have two different sorted sets. One is for editor ID: article_id editor_id 101 10 102 11 103 10 104 10 The other sorted set is for date sorting: article_id day 101 29 102 27 103 25 104 27 I want to merge these sets which shows first editor second day sorted state. Which commands should I use?

2021-11-07 09:58:41    分类:问答    redis   sortedset

如何遍历 SortedSet 以修改其中的项目(How to iterate over a SortedSet to modify items within)

问题 假设我有一个列表。 在for循环中修改list的item是没有问题的: for (int i = 0; i < list.size(); i++) { list.get(i).setId(i); } 但我有一个 SortedSet 而不是列表。 我怎么能用它做同样的事情? 谢谢 回答1 首先, Set假定它的元素是不可变的(实际上,可变元素是允许的,但必须坚持一个非常具体的合同,我怀疑你的类一样)。 这意味着通常您不能像处理列表那样就地修改 set 元素。 Set支持的两个基本操作是元素的添加和删除。 可以将修改视为删除旧元素,然后添加新元素: 您可以在迭代时使用 Iterator.remove(); 处理删除操作。 您可以在一个单独的容器中累积添加,并在最后调用 Set.addAll()。 回答2 您不能修改集合的键,因为它会导致集合重新组合/重新排序。 因此,迭代将如何进一步运行将是未定义的行为。 您可以使用 iterator.remove() 删除元素。 但是您不能添加元素,通常更好的解决方案是将它们累积在一个新集合中并在迭代后将其全部添加。 Set mySet = ...; ArrayList newElems = new ArrayList(); for(final Iterator it = mySet.iterator(); it.hasNext(); ) {

2021-10-31 10:55:28    分类:技术分享    java   iterator   sortedset

从 Redis 中的有序集合的范围创建一个新集合(Creating a new set from a range of a Sorted Set in Redis)

问题 我有许多排序集用作系统上的二级索引,用户查询可能会命中其中的许多。 ZADD scoreSet 1 "fred" ZADD scoreSet 5 "bob" ZADD scoreSet 2 "spodrick" ZADD ageSet 25 "fred" ZADD ageSet 29 "bob" ZADD ageSet 38 "spodrick" 使用这些索引让所有 30 岁以下的用户得分 >2 ZRANGEBYSCORE scoreSet (2 +inf (store these in my application code) ZRANGEBYSCORE ageSet -inf (30 (store these in my application code) (Perform Set intersection in my application code) 但这意味着我已将所有数据从 redis 复制到我的应用程序服务器以执行交集,有没有更有效的方法来做到这一点,我不通过网络传输所有匹配范围,而是在 Rediss 中进行交集? 我想要的是 ZRANGEBYSCORESTORE tempSet1 scoreSet (2 +inf ZRANGEBYSCORESTORE tempSet2 ageSet -inf (30 SINTER tempSet1 tempSet2 其中

2021-10-22 13:23:34    分类:技术分享    redis   sortedset

Redis:排序集中的分数总和(Redis: Sum of SCORES in Sorted Set)

问题 在 Redis 排序集中获得 SCORES 总和的最佳方法是什么? 回答1 我认为唯一的选择是迭代排序集并计算总和客户端。 回答2 从 Redis v2.6 开始可用是在 Redis 服务器上执行 Lua 脚本的最棒的能力。 这使得总结排序集的分数的挑战变得微不足道: local sum=0 local z=redis.call('ZRANGE', KEYS[1], 0, -1, 'WITHSCORES') for i=2, #z, 2 do sum=sum+z[i] end return sum 运行时示例: ~$ redis-cli zadd z 1 a 2 b 3 c 4 d 5 e (integer) 5 ~$ redis-cli eval "local sum=0 local z=redis.call('ZRANGE', KEYS[1], 0, -1, 'WITHSCORES') for i=2, #z, 2 do sum=sum+z[i] end return sum" 1 z (integer) 15 回答3 如果集合很小,并且您不需要出色的性能,我只会迭代 (zrange/zrangebyscore) 并对客户端的值求和。 另一方面,如果您谈论的是数千至数百万件物品,您始终可以为每个用户保留一个包含运行总数的参考集,并在发送礼物时增加/减少它们。 因此

2021-10-21 08:09:38    分类:技术分享    sum   redis   sortedset

为什么Redis SortedSet 使用Skip List 而不是Balanced Tree?(Why Redis SortedSet uses Skip List instead of Balanced Tree?)

问题 Redis文档如下: ZSET 是使用两个数据结构来保存相同元素的有序集合,以便将 O(log(N)) INSERT 和 REMOVE 操作放入一个排序的数据结构中。 这些元素被添加到一个将 Redis 对象映射到分数的哈希表中。 同时,元素被添加到一个跳过列表,将分数映射到 Redis 对象(因此对象在这个“视图”中按分数排序)。 我很不明白。 有人可以给我详细的解释吗? 回答1 Antirez 说,见 https://news.ycombinator.com/item?id=1171423 有几个原因: 它们不是很占用内存。 基本上取决于你。 更改有关节点具有给定级别数的概率的参数将比 btree 占用更少的内存。 排序集通常是许多 ZRANGE 或 ZREVRANGE 操作的目标,即将跳过列表作为链表遍历。 通过此操作,跳过列表的缓存局部性至少与其他类型的平衡树一样好。 它们更易于实现、调试等。 例如,由于跳过列表的简单性,我收到了一个补丁(已经在 Redis master 中),其中包含在 O(log(N)) 中实现 ZRANK 的增强跳过列表。 它几乎不需要对代码进行更改。 关于仅附加持久性和速度,我认为以更多代码和更多复杂性为代价优化 Redis 不是一个好主意,因为恕我直言,Redis 目标应该很少使用这种用例(fsync() 在每个命令中) . 即使使用

2021-10-16 04:50:06    分类:技术分享    data-structures   redis   sortedset   skip-lists

java TreeSet:比较和相等(java TreeSet: comparing and equality)

问题 我想要使​​用属性“sort_1”排序的对象列表。 但是当我想删除时,我希望它使用属性“id”。 以下代码表示问题。 package javaapplication1; import java.util.TreeSet; public class MyObj implements Comparable<MyObj> { public long sort_1; public long id; public MyObj(long sort, long id) { this.sort_1=sort; this.id=id; } @Override public int compareTo(MyObj other) { int ret = Long.compare(sort_1, other.sort_1); return ret; } public String toString() { return id+":"+sort_1; } public static void main(String[] args) { TreeSet<MyObj> lst=new TreeSet<MyObj>(); MyObj o1 = new MyObj(99,1); MyObj o2 = new MyObj(11,9); lst.add(o1); lst.add(o2); System.out

2021-09-21 12:03:13    分类:技术分享    java   treeset   sortedset