Tag: 算法

更快计算项目出现的套数?

我有一个书签列表。 每个书签都有一个关键字列表(存储为HashSet)。 我还有一组所有可能的关键字(“宇宙”)。 我想找到大多数书签中出现的关键字。 我有1356个书签,总共有698,539个关键字,其中187,358个是唯一的。 如果我遍历Universe中的每个关键字并计算它出现的书签数量,我就会进行254,057,448次检查。 我的机器需要35秒。 算法非常简单: var biggest = universe.MaxBy(kw => bookmarks.Count(bm => bm.Keywords.Contains(kw))); 使用Jon Skeet的MaxBy 。 我不确定是否有可能加快这个速度,但有什么我可以做的吗? 也许以某种方式并行化它? dtb的解决方案需要不到200毫秒来构建宇宙并找到最大元素。 很简单。 var freq = new FreqDict(); foreach(var bm in bookmarks) { freq.Add(bm.Keywords); } var biggest2 = freq.MaxBy(kvp => kvp.Value); FreqDict只是我在Dictionary之上构建的一个小类。

列表的独特组合

绝对的心灵空白。 那是其中的一天。 但我一直在寻找一种解决方案,以获得一定长度的项目列表的独特组合。 例如,给定一个列表[a,b,c]和长度为2,它将返回[a,b] [a,c] [b,c]但不返回[b,a] [c,a] [c ,b]的 为此,我发现了许多代码,但似乎没有一个代码。 以下代码似乎最合适,我一直在尝试根据我的需要改变它: // Returns an enumeration of enumerators, one for each permutation // of the input. public static IEnumerable<IEnumerable> Permute(IEnumerable list, int count) { if (count == 0) { yield return new T[0]; } else { int startingElementIndex = 0; foreach (T startingElement in list) { […]

两个坐标的相对基数方向

以下枚举定义如下: public enum Direction { North, South, East, West, Northeast, Northwest, Southeast, Southwest, Undefined } 给定二维空间中的两组坐标,我想确定从第2点到第1点的相对基数方向。 例子: P1(1,1)和P2(0,1)返回Direction.North,因为P2在P1的北边 P1(1,1)和P2(5,4)返回Direction.Southeast P1(1,1)和P2(1,1)返回Direction.Undefined 我目前的方法涉及一系列条件,即 if (P1.X == P2.X) { // either North, South or Undefined if (P1.Y P2.Y) return Direction.North, else return Direction.Undefined; } else if (P1.Y == P2.Y) { … } else { … } 我正在寻求更短,更优雅的解决方案。

如何实现非随机的随机数生成器?

我需要一个随机数生成器,它在n和m之间产生不同的数字,但是没有相同的概率。 我想在n和m之间设置一个值x,其中可能性最高: 使用Random类有一种简单的方法吗? 可能性应该具有二项式分布或类似的forms(其精确的二项式分布并不重要,粗略近似也可以) 编辑 也许我必须澄清:我不是在寻找二分法或高斯分布,而是在寻找这样的东西: 我想定义值x应该是最高可能性的值。 编辑 不幸的是,我之前接受的答案似乎并不起作用 。 所以我还在寻找答案!

ASM中快速的little-endian到big-endian转换

我在C#中有一个uint类型数组,在检查程序是否在小端机器上运行之后,我想将数据转换为big-endian类型。 因为数据量可以变得非常大但总是均匀,我想考虑将两种uint类型作为ulong类型,以获得更好的性能并在ASM中对其进行编程,所以我搜索的速度非常快(如果可能的话,速度最快) )汇编程序算法转换big-endian的big-endian。

迭代最近点实现

我目前正在使用以下伪代码在C#中实现ICP算法。 从ICP Powerpoint获得 function ICP(Scene,Model) begin E` = + ∞; (Rot,Trans) = In Initialize-Alignment(Scene,Model); repeat E = E`; Aligned-Scene = Apply-Alignment(Scene,Rot,Trans); Pairs = Return-Closest-Pairs(Aligned-Scene,Model); (Rot,Trans,E`) = Update-Alignment(Scene,Model,Pairs,Rot,Trans); Until |E`- E| < Threshold return (Rot,Trans); end 但是我不完全确定应该如何实现更新对齐? 如果有人能解释这一点比powerpoint更清楚:)我已经编写了计算对应错误和对齐错误的方法,但是我不知道如何应用这些来获得新的更新对齐。

如何找到两个图像之间的差异矩形

我有两个相同大小的图像。 找到它们不同的矩形的最佳方法是什么。 显然,我可以在不同方向上浏览图像4次,但我想知道是否有更简单的方法。 例: 第一张图片http://sofzh.miximages.com/c%23/2cg0u2h.png 第二张图片http://sofzh.miximages.com/c%23/14l0y13.png 差异http://sofzh.miximages.com/c%23/5agshd.png

Array.Sort in with nontrivial comparison function

在Nutshell中考虑C#5.0中的以下代码,p。 289: int[] numbers = { 1, 2, 3, 4, 5 }; Array.Sort (numbers, (x, y) => x % 2 == y % 2 ? 0 : x % 2 == 1 ? -1 : 1); 得到结果{3, 5, 1, 2, 4} 。 我在纸上尝试了这个并得到{1, 3, 5, 2, 4} 。 为什么计算机排序给3 > 5 > 1 ?

c#GDI边缘空白检测算法

我正在寻找一种从c#托管的GDI +库中检测 c#位图的边缘空白的解决方案。 图像可以是透明的或白色的 ,400x图像中的大多数是8000x8000px,边缘周围有大约2000px的空白。 找出边缘, x,y,高度和宽度坐标的最有效方法是什么? 我尝试逐像素,但发现它很慢。 更新到解决方案 –添加左/右/上/下边界 图像细节中心图像的问题现在裁剪任何透明(0%)或白色(#FFFFFF)像素。 var top = bitmap.Height; var left = bitmap.Width; var right = 0; var bottom = 0; … var pData = pData0 + (y * data.Stride) + (x * 4); var xyAlpha = pData[3]; var xyBlue = pData[0]; var xyGreen = pData[1]; var xyRed = […]

C#中的加权随机数生成

题 如何随机生成两种状态中的一种,10%的时间内产生“红色”概率,90%的时间产生“绿色”? 背景 每2秒钟,绿灯或红灯都会闪烁。 该序列将持续5分钟。 闪烁灯的总发生次数应为300。