Tag: 算法

用于计算百分位数以移除exception值的快速算法

我有一个程序需要重复计算数据集的近似百分位数(顺序统计),以便在进一步处理之前删除exception值。 我目前正在通过对值数组进行排序并选择适当的元素来实现这一目标; 这是可行的,但尽管是该计划的一个相当小的部分,但它在配置文件上是一个明显的昙花一现。 更多信息: 该数据集包含最多100000个浮点数的数量级,并假设“合理地”分布 – 在特定值附近不太可能存在重复,密度也不大; 如果由于某种奇怪的原因,分布是奇数,那么近似值就不太准确了,因为数据可能无论如何都搞砸了,并且进一步处理可疑。 但是,数据不一定是统一的或正态分布的; 它不太可能退化。 一个近似的解决方案很好,但我需要了解近似值如何引入错误以确保它有效。 由于目标是去除exception值,我在任何时候都在同一数据上计算两个百分点:例如一个在95%,一个在5%。 该应用程序在C#中,在C ++中有点繁重; 任何一个伪代码或预先存在的库都可以。 一个完全不同的去除exception值的方法也可以,只要它是合理的。 更新:似乎我正在寻找一种近似选择算法 。 虽然这都是在一个循环中完成的,但每次数据都会略微不同,因此重用数据结构并不像这个问题那样容易。 实施解决方案 使用Gronim建议的维基百科选择算法将这部分运行时间缩短了大约20倍。 由于我找不到C#实现,这就是我想出的。 即使对于小型输入,它也比Array.Sort更快; 在1000个元素上,速度提高了25倍。 public static double QuickSelect(double[] list, int k) { return QuickSelect(list, k, 0, list.Length); } public static double QuickSelect(double[] list, int k, int startI, int endI) { while (true) { // Assume […]

为Web请求实施速率限制算法的最佳方法是什么?

可能/部分重复: 什么是一个好的速率限制算法? 限制方法在N秒内调用M个请求 在ASP.NET MVC中实现请求限制的最佳方法? 我正在寻找为Web应用程序实现移动时间窗口速率限制算法的最佳方法,以减少垃圾邮件或暴力攻击。 使用的示例是“最近5分钟内来自给定IP的最大失败登录尝试次数”,“最近N分钟内的最大((post/投票/等等)…”)。 我宁愿使用移动时间窗口算法,而不是每X分钟重新统计一次(比如twitter api)。 这将是一个C#/ ASP.Net应用程序。

C#中的循环竞赛算法

我在实现这个小循环项目时遇到了一些麻烦。 我尝试做的是生成游戏的预览日历 那我想输出; 第1天:第1队与第2队; 第3队与第4队; Team 5vs Team 6; 第2天第1队与第4队; 第6队与第3队; 第2队与第5队; 直到锦标赛结束; 这是我到目前为止所获得的代码,但是当arrays的其余部分旋转时,我很难让第一个团队修复……: static void Main(string[] args) { string[] ListTeam = new string[] {“Equipe1”, “Equipe2”, “Equipe3”, “Equipe4”, “Equipe5”, “Equipe6”}; IList ListMatch = new List(); it NumberOfDays = (ListTeam.Count()-1); int y = 2; for (int i = 1; i 0 ; y–) { Console.WriteLine(ListTeam[y].ToString() + […]

如何将数字反转为整数而不是字符串?

我遇到了一个问题“如何将数字反转为整数而不是字符串?” 有谁可以帮我找到答案。

计算正多边形顶点的坐标

我正在编写一个程序,我需要绘制任意数量边的多边形,每个边都由一个动态变化的给定公式进行翻译。 有一些相当有趣的数学,但我被困在这个问题上。 如何只计算边数 ,并且理想地(但不是必须)将原点放在中心,我如何计算正多边形(一个所有角度相等的顶点)顶点的坐标? 例如:六边形可能有以下几点(都是float ): ( 1.5 , 0.5 *Math.Sqrt(3) ) ( 0 , 1 *Math.Sqrt(3) ) (-1.5 , 0.5 *Math.Sqrt(3) ) (-1.5 , -0.5 *Math.Sqrt(3) ) ( 0 , -1 *Math.Sqrt(3) ) ( 1.5 , -0.5 *Math.Sqrt(3) ) 我的方法看起来像这样: void InitPolygonVertexCoords(RegularPolygon poly) 并且需要将坐标添加到此(或类似的东西,如列表): Point[] _polygonVertexPoints; 我主要对这里的算法感兴趣,但C#中的例子会很有用。 我甚至不知道从哪里开始。 我该如何实施呢? 它甚至可能吗?! 谢谢。

在C#中匹配的模糊文本(句子/标题)

嘿,我正在使用Levenshteins算法来获取源和目标字符串之间的距离。 我也有从0到1返回值的方法: /// /// Gets the similarity between two strings. /// All relation scores are in the [0, 1] range, /// which means that if the score gets a maximum value (equal to 1) /// then the two string are absolutely similar /// /// The string1. /// The string2. /// public static float CalculateSimilarity(String s1, […]

从整数中获取第七位数字

我有一个10位数的整数。 我需要获得该整数的第7位数。 我找到了一个数学解法来获得整数的第一个数字。 var myDigit = 2345346792; var firstDigit = Math.Abs(myDigit); while (firstDigit >= 10) { firstDigit /= 10; } 我如何从myDigit获得第七位数字? 我试图避免强制转换为字符串并执行子字符串。 我希望看到获得第七位数字的数学版本。 任何人?

使用c#有效识别CSV文件中已更改的字段

事实certificate这比我想象的要困难得多。 基本上,每天系统会将客户主列表的快照转储为CSV。 它包含大约120000条记录和60个字段。 大约25mb。 无论如何,我想报告一个快照与另一个快照之间发生变化的值。 它不是计划文件差异,因为它必须匹配包含客户唯一编号的最左侧列值。 可以插入/删除行等。所有字段都是字符串,包括参考编号。 我已经用LINQ编写了一个解决方案,但它随着更大的数据集而死亡。 对于10000条记录,需要17秒。 对于120000,比较这两个文件需要将近2个小时。 现在它使用优秀且免费的’filehelpers’http: //www.filehelpers.com/来加载数据,这只需要几秒钟。 但是检测哪些记录已经改变更成问题。 以下是2小时查询: var changednames = from f in fffiltered from s in sffiltered where f.CustomerRef == s.CustomerRef && f.Customer_Name != s.Customer_Name select new { f, s }; 你会推荐什么方法? 我想立即将列表“修剪”给那些有某种变化的人,然后将我更具体的比较应用于那个小子集。 我的一些想法是: a)使用字典或Hashsets-虽然早期的测试并没有真正显示出改进 b)区分操作 – 使用客户参考字段中的第一个字符,并仅与具有相同字符的字符匹配。 这可能涉及创建许多单独的集合,但似乎非常不优雅。 c)远离类型化数据安排并使用数组进行操作。 再次,利益不确定。 有什么想法吗? 谢谢!

四舍五入到下个季度

我想将一个数字四舍五入到下一季度(即2.1轮到2.25)。 我知道我可以通过使用Math.Round(num * 4) / 4获得最接近的四分之一,但我想扩展它,以便它总是Math.Round(num * 4) / 4入到下一个季度。 到目前为止,我唯一的解决方案是使用if块,但我想首先用尽单线算法,试图保持简单。 这在技术上与语言无关,但在这种情况下我使用的是C#。 需要说明的是,以下是我想要的例子: 2.0保持为2.0 2.01 – 2.24回升至2.25 2.25保持为2.25 2.26 – 2.49轮到2.5 等等…

项目Euler:问题1(可能的重构和运行时优化)

我听过很多关于Project Euler的消息,所以我想我解决了C#中的一个问题。 网站上所述的问题如下: 如果我们列出10以下的所有自然数是3或5的倍数,我们得到3,5,6和9.这些倍数的总和是23。 求出1000以下3或5的所有倍数的总和。 我编写了如下代码: class EulerProblem1 { public static void Main() { var totalNum = 1000; var counter = 1; var sum = 0; while (counter < totalNum) { if (DivisibleByThreeOrFive(counter)) sum += counter; counter++; } Console.WriteLine("Total Sum: {0}", sum); Console.ReadKey(); } private static bool DivisibleByThreeOrFive(int counter) { return ((counter % 3 == […]