我正在计算我的应用程序的时间关键部分中的两组排序数字的交集.这个计算是整个应用程序的最大瓶颈,所以我需要加快速度.
我尝试过一些简单的选项,目前正在使用它:
foreach (var index in firstSet)
{
if (secondSet.BinarySearch(index) < 0)
continue;
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
这两个firstSet和secondSet的类型列表.
我也尝试过使用LINQ:
var intersection = firstSet.Where(t => secondSet.BinarySearch(t) >= 0).ToList();
Run Code Online (Sandbox Code Playgroud)
然后循环intersection.
但是,由于这两个集合都已排序,我觉得有更好的方法.请注意,我无法从集中删除项目以使其变小.两套通常每件约50件.
请帮助我们,因为我没有太多时间来完成这件事.谢谢.
注意:我这样做了大约530万次.所以每微秒都很重要.
在Clojure中,该set函数自动将a vector或lista 转换为a set.但事实并非如此sorted-set:
(set [3 2 1]) ; #{1 2 3}
(set '(3 2 1)) ; #{1 2 3}
(sorted-set [3 2 1]) ; #{[3 2 1]}
(sorted-set '(3 2 1)) ; #{(3 2 1)}
Run Code Online (Sandbox Code Playgroud)
这是我提出的解决方案:
(defn sorted-set-from-coll [coll]
(eval (cons sorted-set (seq coll))))
(def v [3 2 1])
(sorted-set-from-coll v) ; #{1 2 3}
(sorted-set-from-coll '(3 2 1)) ; #{1 2 3}
(sorted-set-from-coll [3 1 2]) ; #{1 2 3} …Run Code Online (Sandbox Code Playgroud) 从SortedSet<T>.GetEnumerator文档:
该方法是O(1)操作
从SortedDictionary<K, V>.GetEnumerator文档:
此方法是O(log n)操作,其中n是count.
这两个陈述都可以是真的,考虑到SortedDictionary<K, V>内部实现为SortedSet<KeyValuePair<K, V>?我检查了类的GetEnumerator代码SortedDictionary- 它直接使用了SortedSet枚举器.我注意到了SortedSet枚举器的实现,在我看来它确实有O(log n)特性(这里是代码):
public SortedSet<T>.Enumerator GetEnumerator()
{
return new SortedSet<T>.Enumerator(this);
}
//which calls this constructor:
internal Enumerator(SortedSet<T> set)
{
this.tree = set;
this.tree.VersionCheck();
this.version = this.tree.version;
this.stack = new Stack<SortedSet<T>.Node>(2 * SortedSet<T>.log2(set.Count + 1));
this.current = (SortedSet<T>.Node) null;
this.reverse = false;
this.siInfo = (SerializationInfo) null;
this.Intialize();
}
private void Intialize()
{
this.current = (SortedSet<T>.Node) null;
SortedSet<T>.Node …Run Code Online (Sandbox Code Playgroud) 在Java中,我有一个可能有100,000个元素的SortedSet.我想高效优雅地获得最后25个元素.我有点不解.
为了获得前 25个,我会迭代并在25个元素后停止.但我不知道如何以相反的顺序迭代.有任何想法吗?
SortedSet<Integer> summaries = getSortedSet();
// what goes here :-(
Run Code Online (Sandbox Code Playgroud) 我在mysql中有一个日志数据
id | value | date
1 | 10.2 | 2017-07-20 18:00:00
2 | 10.5 | 2017-07-20 18:00:01
3 | 10.3 | 2017-07-20 18:00:03
Run Code Online (Sandbox Code Playgroud)
然后将其转换为 redis 中的 hash dan 排序集。这是我的哈希:
hmset mylog:1 id 1 value 10.2 date 1388534400
hmset mylog:2 id 2 value 10.5 date 1388534401
hmset mylog:3 id 3 value 10.3 date 1388534402
Run Code Online (Sandbox Code Playgroud)
和排序集:
zadd log_date 1388534400 1
zadd log_date 1388534401 2
zadd log_date 1388534402 3
Run Code Online (Sandbox Code Playgroud)
我想执行查询就像 WHERE date beetween .... and ....
有没有可能根据排序集中的日期范围从哈希中获取数据?
谢谢!
我正在编写一个算法,用于以最少的工作量来推断用户.根据正在创建的任务的类型/复杂性,我缩小了能够执行它的用户列表.现在,我需要找到当前分配给他/她的任务编号最少的用户.我使用redis排序集来存储成员/用户的分数,指示分配给他们的任务的数量.有没有办法让一个成员得分最低的成员?
我正在使用Redis排序集来实现我的游戏的排行榜,其中我按降序显示用户排名.我陷入了两个或更多用户具有相同分数的情况.所以在这种情况下,我希望获得得分的用户排名更高.例如,我在Redis中添加以下条目.
127.0.0.1:6379> zadd testing-key 5 a
(integer) 1
127.0.0.1:6379> zadd testing-key 4 b
(integer) 1
127.0.0.1:6379> zadd testing-key 5 c
(integer) 1
Run Code Online (Sandbox Code Playgroud)
当我以相反的顺序查询等级时,我得到了这个
127.0.0.1:6379> zrevrange testing-key 0 10
1) "c"
2) "a"
3) "b"
Run Code Online (Sandbox Code Playgroud)
但就我而言,排名应该是这样的
1) "a"
2) "c"
3) "b"
Run Code Online (Sandbox Code Playgroud)
那么Redis中是否有任何规定给予以相同分数首先进入集合的实体更高的优先级?
我认为这null是允许的Set.
那么为什么以下代码:
SortedSet<Integer> set = new TreeSet<Integer>();
set.add(null);
set.add(1); //--->Line indicated by exception
Run Code Online (Sandbox Code Playgroud)
给出以下例外?
java 中java.util.TreeMap.put(未知来源)的
java.lang.Integer.compareTo(未知来源)中的
java.lang.Integer.compareTo(未知来源)中的线程"main"java.lang.NullPointerException中的异常. util.TreeSet.add(未知来源)
我想使用以下内容在Map中打印一个有序列表:
Map<Float, String> mylist = new HashMap<>();
mylist.put(10.5, a);
mylist.put(12.3, b);
mylist.put(5.1, c);
SortedSet<Float> orderlist = new TreeSet<Float>(mylist.keySet());
for (Float i : orderlist) {
System.out.println(i+" "+mylist.get(i));
}
Run Code Online (Sandbox Code Playgroud)
上面的代码打印:
5.1 c
10.5 a
12.3 b
Run Code Online (Sandbox Code Playgroud)
但是如何以相反的顺序打印订单列表,如下所示:
12.3 b
10.5 a
5.1 c
Run Code Online (Sandbox Code Playgroud) 在微软文档中,复杂度表示为O(n)
但如果你看看实施情况
foreach (T item in other)
{
if (Contains(item))
{
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
,然后对每个元素调用搜索方法,其复杂度为 O(m*log(n))
谁是真正正确的?
sortedset ×10
.net ×3
java ×3
redis ×3
c# ×2
treeset ×2
.net-6.0 ×1
big-o ×1
clojure ×1
collections ×1
hash ×1
intersection ×1
leaderboard ×1
zset ×1