Tag: 算法

ContainsKey和TryGetValue的性能是什么?

我正在准备采访,一些明显的采访问题,如计算字符串中字符的频率,涉及将所有字符放入Hashtable / Dictionary中,以便获得算法的O(n)运行时间。 我的问题是,使用ContainsKey和TryGetValue检查是否已将某个密钥插入Hashtable会导致性能下降? 对于使用ContainsKey或TryGetValue问题,我是否仍然可以使用O(n)算法?

X的每个可能组合分成N个堆栈

我确信这个问题有一个正式的名称,并且知道这个名字可能会帮助我找到解决方案,但我不知道,并且谷歌的问题一直指向我背包问题 ,这是不一样的事情。 我想取一些值X并找到将该值拆分为N个整数整数的可能组合。 如果我的措辞令人困惑,这里是X = 4,N = 3的例子 Stack -> 1 | 2 | 3 | ———————- #1—–> 4 | 0 | 0 | ———————- #2—–> 3 | 1 | 0 | ———————- #3—–> 2 | 1 | 1 | ———————- #4—–> 2 | 2 | 0 | 复制是可以接受的,因为它很容易删除,但理想情况下不会计算。 解决问题的算法将是完美的,但即使找出问题的名称也会使研究更容易。 谢谢。

扫描图像以查找矩形

我正在尝试扫描一个恒定大小的图像,并在其中找到绘制的矩形。 矩形可以有任何尺寸,但只有红色。 这不是问题的起点。 我将使用已经编写的函数,稍后我会将其用作伪代码调用代码逻辑。 Rectangle Locate(Rectangle scanArea); //扫描给定扫描区域中的矩形。 如果未找到rectagle,则返回null。 我的逻辑是这样的: 使用Locate()函数查找第一个初始红色矩形,并将完整图像大小作为参数。 现在,划分其余区域,并继续递归扫描。 这个算法逻辑的要点是你永远不会检查已经检查过的区域,并且你不必使用任何条件,因为scanArea参数总是一个你之前没有scanArea的新区域(这要归功于划分技术)。 除法过程如下所示:当前找到的矩形的右侧区域,底部区域和左侧区域。 这是一个说明该过程的图像。 (白色虚线矩形和黄色箭头不是图像的一部分,我只是为了插图而添加它们。)如您所见,一旦发现红色矩形,我会一直扫描它的右边,左下角。 递归。 所以这是该方法的代码: List difList=new List(); private void LocateDifferences(Rectangle scanArea) { Rectangle foundRect = Locate(scanArea); if (foundRect == null) return; // stop the recursion. Rectangle rightArea = new Rectangle(foundRect.X + foundRect.Width, foundRect.Y, (scanArea.X + scanArea.Width) – (foundRect.X + foundRect.Width), (scanArea.Y […]

将壁序列表转换为相干多边形的算法

我有一对成对点描述多边形的点列表,如下所示: 是正方形。 请注意,每对点描述一条线,因此我们的方块由线组成 < > < > < > < > 然而,我必须绘制这些多边形,当所讨论的点都正确有序并且没有孔时,这些多边形可以正常工作。 不幸的是,当输入类似时,这有时会出错 并且生成的多边形很奇怪或者有多边形几个洞 在这些情况下,使用drawpoly(点)绘制这些多边形的初始事情是行不通的。 这是在c#中,输入实际上是List ,其中GeoData包含2个点(以及一些其他misq数据)。 对于输出,我正在考虑制作一个List和一个List>,其中第一组点是外线,第二个列是孔,这会起作用吗? 我确实需要对多边形进行一些额外的计算,然后只绘制,但我认为使用特殊的孔列表将是最简单的。 这是一个例子: 左边是我目前右边的输入。

查找在字符串中多次使用过的短语

通过使用字典来识别最常使用的单词,但是给定文本文件,可以很容易地计算文件中单词的出现次数,如何找到常用短语,其中“短语”是连续两个或更多个的集合话? 例如,以下是一些示例文本: 除口头遗嘱外,每一个遗嘱都应采用书面forms,但可以手写或打字。 遗嘱应包含遗嘱人的签名或其他人在遗嘱人的有意识的存在和立遗嘱人的明确指示。 遗嘱应由立遗嘱人在有意识的存在下 ,由两名或多名主管证人certificate和认购,他们看到立遗嘱人认购,或听取立遗嘱人确认立遗嘱人的签名 。 出于本节的目的, 有意识存在意味着在任何立遗嘱者的感官范围内,不包括通过电话,电子或其他远程通信感知的视觉或声音。 我如何识别“有意识存在”(3次)和“立遗嘱人签名”(2次)这些短语出现不止一次(除了蛮力搜索每一组两三个单词)? 我将用c#编写这个,所以c#代码会很棒,但是我甚至无法识别出一个好的算法,所以我会解决所有代码甚至伪代码以解决这个问题。

anagram算法

这是为文本生成字谜的最佳方法(最多80个字符长度)。 示例:输入:狗输出狗dgo odg ogd gdo god 我只想到一个回溯解决方案,但如果文本更长,那将需要一段时间。 另一个想法是为字典中的所有单词建立起来,但问题不是要求真正的单词。 有人能指出最小时间复杂度解决方案吗? 谢谢!

将字符串中的“奇异”字符转换为罗马字符

我需要能够将用户输入转换为[az]罗马字符(不区分大小写)。 所以,我感兴趣的只有26个字符。 但是,用户可以键入他们希望的那些字符的任何“forms”。 西class牙语“n”,法语“e”和德语“u”都可以从用户输入中获得重音(由程序删除)。 我对这两种扩展方法非常接近: public static string LettersOnly(this string Instring) { char[] aChar = Instring.ToCharArray(); int intCount = 0; string strTemp = “”; for (intCount = 0; intCount <= Instring.Length – 1; intCount++) { if (char.IsLetter(aChar[intCount]) ) { strTemp += aChar[intCount]; } } return strTemp; } public static string RemoveAccentMarks(this string s) { string […]

计算百分比分布中的下一个项目

我正在开展一个项目,涉及将电话转移到多个目的地。 例如,我想: 10%的电话到达目的地A. 20%的电话前往目的地B. 30%的电话转到目的地C. 40%的电话前往目的地D. 目的地数量及其百分比必须是可配置的。 我一直在考虑如何做到这一点,玩电子表格和一些代码,我想出了这个: 对于每个目的地,取一个随机数,乘以百分比,然后选择编号最大的目的地。 像这样: Item: RANDOM * PERCENTAGE = RESULT A: 48 * 10 = 480 B: 33 * 20 = 660 C: 81 * 30 = 2430 <— Highest number, select C D: 5 * 40 = 200 我以为我已经解决了,因为D显然会被选中最多,其次是C,然后是B,最不是A. 但它不起作用。 如果我这样做5000次,并计算每个目的地被选中的实际百分比,我得到这个: 1%的电话前往目的地A. 12%的电话前往目的地B. 31%的电话转到目的地C. 56%的电话到达目的地D. 这是我用来测试这个的代码: // Initialise […]

系列计算

我有一些随机整数 99 20 30 1 100 400 5 10 我必须从这些整数的任意组合中找到一个总和,它与给定的数字最接近(等于或多但不少) 183 这样做最快,最准确的方法是什么?

关于逻辑/算法的想法以及如何防止对SqlServer的线程写入中的竞争

我有以下逻辑: public void InQueueTable(DataTable Table) { int incomingRows = Table.Rows.Count; if (incomingRows >= RowsThreshold) { // asyncWriteRows(Table) return; } if ((RowsInMemory + incomingRows) >= RowsThreshold) { // copy and clear internal table // asyncWriteRows(copyTable) } internalTable.Merge(Table); } 这个算法有一个问题: 给定RowsThreshold = 10000 如果incomingRows将RowsInMemory放在RowsThreshold :(1)异步写出数据,(2)合并传入数据 如果incomingRows超过RowsThreshold ,则异步写入传入数据 但是如果??? 假设第二个线程旋转并调用asyncWriteRows(xxxTable); 另外,拥有异步方法的每个线程都将写入SqlServer中的同一个表: SqlServer是否将这种multithreading写入function处理到同一个表中? 跟进 根据Greg D的建议: using (SqlBulkCopy bulkCopy […]