Questions tagged «algorithm»

算法是定义明确的问题解决方案的一系列明确定义的步骤。当您的问题与算法设计有关时,请使用此标签。

13
用于估计统计中值,众数,模式,偏度,峰度的“在线”(迭代器)算法?
是否有一种算法可以估计一组值的中值,众数,偏度和/或峰度,但是不需要一次将所有值存储在内存中? 我想计算基本统计数据: 平均值:算术平均值 方差:与平均值的平方偏差的平均值 标准偏差:方差的平方根 中位数:将数字大半部分与小半部分分开的值 模式:集合中最常出现的值 偏度:tl; 博士 峰度:tl; 博士 计算其中任何一个的基本公式是小学算术,我确实知道它们。也有许多实现它们的统计资料库。 我的问题是我正在处理的集合中有大量(十亿个)值:在Python中工作,我不能仅仅创建包含数十亿个元素的列表或哈希。即使我用C编写此代码,十亿个元素的数组也不太实用。 数据未排序。它是由其他过程动态随机产生的。每个集合的大小是高度可变的,并且大小不会事先知道。 我已经弄清楚了如何很好地处理均值和方差,以任意顺序遍历集合中的每个值。(实际上,就我而言,我按它们生成的顺序进行处理。)这是我使用的算法,由http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#On-line_algorithm提供: 初始化三个变量:count,sum和sum_of_squares 对于每个值: 增量计数。 将值相加。 将值的平方添加到sum_of_squares。 将总和除以计数,并存储为变量均值。 将sum_of_squares除以计数,存储为变量mean_of_squares。 平方均值,存储为square_of_mean。 从mean_of_squares中减去square_of_mean,并存储为方差。 输出均值和方差。 这种“在线”算法具有弱点(例如,由于sum_of_squares迅速增长到大于整数范围或浮点精度的精度问题),但是它基本上满足了我的需要,而不必在每个集合中存储每个值。 但是我不知道是否存在类似的技术来估算其他统计数据(中位数,众数,偏度,峰度)。只要处理N个值所需的内存大大小于O(N),我就可以使用有偏估计器,甚至可以使用在某种程度上损害准确性的方法。 如果该库具有“在线”计算这些操作中的一项或多项的功能,则将我指向现有的统计信息库也将有所帮助。

10
反转4x4矩阵
我正在寻找有关如何反转4x4矩阵的示例代码实现。我知道有高斯消除,LU分解等,但是我没有详细研究它们,而是寻找代码来完成此任务。 理想的语言是C ++,可以按列优先顺序将数据以16个浮点数的数组形式提供。

19
在大单词序列中查找前K个常见单词的最有效方法
输入:正整数K和大文本。文本实际上可以视为单词序列。因此,我们不必担心如何将其分解为单词序列。 输出:文本中最常见的K字。 我的想法是这样的。 使用哈希表记录遍历整个单词序列时所有单词的频率。在此阶段,键是“单词”,值是“单词频率”。这需要O(n)时间。 对(单词,单词频率)对进行排序;关键是“单词频率”。使用常规排序算法,这需要O(n * lg(n))时间。 排序后,我们只取前K个字。这需要O(K)时间。 总而言之,总时间为O(n + n lg(n)+ K),因为K肯定小于N,所以实际上为O(n lg(n))。 我们可以改善这一点。实际上,我们只想要前K个字。换句话说,频率与我们无关。因此,我们可以使用“部分堆排序”。对于步骤2)和3),我们不只是进行排序。相反,我们将其更改为 2')以“ word-frequency”为关键字构建(word,word-frequency)对的堆。构建堆需要O(n)时间; 3')从堆中提取前K个字。每次提取为O(lg(n))。因此,总时间为O(k * lg(n))。 总而言之,该解决方案花费时间O(n + k * lg(n))。 这只是我的想法。我还没有找到改善步骤1)的方法。 我希望一些信息检索专家可以对这个问题有更多的了解。

11
混淆ID
我正在寻找一种将整数ID加密/混淆为另一个整数的方法。更准确地说,我需要一个函数int F(int x),以便 x <-> F(x)是一一对应的(如果x!= y,F(x)!= F(y)) 给定F(x),很容易找出x-因此F不是哈希函数 给定x和F(x),很难/不可能找出F(y),类似的东西是x ^ 0x1234行不通的 为了清楚起见,我并不是在寻找强大的加密解决方案,而只是在混淆。想象一下,像URL的Web应用程序example.com/profile/1,example.com/profile/2等型材本身并不是秘密,但我想,以防止随意偷窥到视图/读取所有配置了一个又一个,所以我宁愿躲在他们身后像example.com/profile/23423,example.com/profile/80980234等等。虽然数据库存储的令牌可以很轻松地完成这项工作,我很好奇是否有一些简单的数学方法可用于此。 我不清楚的一个重要要求是结果应该看起来是“随机的”,也就是说,给定一个序列x,x+1,...,x+n,F(x),F(x+1)...F(x+n)不应形成任何形式的进展。


7
什么是算法的摊销分析?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 改善这个问题 与渐进分析有何不同?您何时使用它,为什么? 我读过一些写得不错的文章,例如: http://www.ugrad.cs.ubc.ca/~cs320/2010W2/handouts/aa-nutshell.pdf http://www.cs.princeton.edu/~fiebrink/423/AmortizedAnalysisExplained_Fiebrink.pdf 但我仍然没有完全理解这些概念。 那么,有人可以为我简化一下吗?

11
插入排序与冒泡排序算法
我试图了解一些排序算法,但是我正努力查看气泡排序和插入排序算法的区别。 我知道两者都是O(n 2),但是在我看来,冒泡排序只是将每次通过时数组的最大值冒泡到顶部,而插入排序只会使每次通过时将最小值沉到底部。他们不是在做完全相同的事情,只是朝不同的方向做吗? 对于插入排序,比较/潜在交换的次数从零开始,并且每次都增加(即0、1、2、3、4,...,n),但对于冒泡排序,会发生相同的行为,但是在结束时排序(即n,n-1,n-2,... 0),因为气泡排序在排序时不再需要与最后一个元素进行比较。 尽管如此,似乎人们普遍认为插入排序通常更好。谁能告诉我为什么? 编辑:我主要是对算法工作方式的差异感兴趣,而不是它们的效率或渐进复杂性。

15
如何在恒定大小的块中拆分可迭代
可能重复: 如何在Python中将列表分成大小均匀的块? 令我惊讶的是,我找不到“批处理”函数,该函数会将可迭代对象作为输入并返回可迭代对象的可迭代对象。 例如: for i in batch(range(0,10), 1): print i [0] [1] ... [9] 要么: for i in batch(range(0,10), 3): print i [0,1,2] [3,4,5] [6,7,8] [9] 现在,我写了我认为很简单的生成器: def batch(iterable, n = 1): current_batch = [] for item in iterable: current_batch.append(item) if len(current_batch) == n: yield current_batch current_batch = [] …

3
代码完成如何工作?
许多编辑器和IDE都有代码完成功能。其中一些是非常“智能”的,其他则不是。我对更智能的类型感兴趣。例如,我看到IDE仅在以下情况下提供功能:a)在当前范围内可用b)其返回值有效。(例如,在“ 5 + foo [tab]”之后,它仅提供返回可以添加到正确类型的整数或变量名称的函数。)我还看到它们将更常用或最长的选项放在前面列表中。 我知道您需要解析代码。但是通常在编辑当前代码时无效,其中包含语法错误。当内容不完整且包含错误时,您该如何解析? 还有一个时间限制。如果花几秒钟才能得出列表,则完成是没有用的。有时,完成算法处理数千个类。 有什么好的算法和数据结构?

25
生成质数的最优雅方法
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 改善这个问题 什么是实现此功能的最佳方法: ArrayList generatePrimes(int n) 此函数生成第一个n素数(edit:where n>1),因此generatePrimes(5)将返回ArrayListwith {2, 3, 5, 7, 11}。(我正在用C#进行此操作,但是我对Java实现很满意-或其他与此类似的语言(因此没有Haskell))。 我确实知道如何编写此函数,但是昨晚当我这样做时,它并没有达到我希望的那样好。这是我想出的: ArrayList generatePrimes(int toGenerate) { ArrayList primes = new ArrayList(); primes.Add(2); primes.Add(3); while (primes.Count < toGenerate) { int nextPrime = (int)(primes[primes.Count - 1]) + 2; while (true) { bool isPrime = true; foreach (int n …
84 c#  java  algorithm  primes 

13
为图的Y轴选择有吸引力的线性比例
我正在编写一些代码以在我们的软件中显示条形图。一切都很好。让我感到困扰的是标注Y轴。 呼叫者可以告诉我他们想要对Y比例尺进行标记的精确程度,但是我似乎始终坚持以“有吸引力”的方式对它们进行标注。我无法形容“有吸引力”,也许您也不能形容,但是看到它我们就知道了,对吗? 因此,如果数据点是: 15, 234, 140, 65, 90 用户要求在Y轴上贴上10个标签,然后用纸和铅笔稍微摆弄一下: 0, 25, 50, 75, 100, 125, 150, 175, 200, 225, 250 因此,那里有10个(不包括0),最后一个超出了最大值(234 <250),并且每个增加了“不错”,为25。如果他们要求提供8个标签,则增加30个标签看起来不错: 0, 30, 60, 90, 120, 150, 180, 210, 240 九个人会很棘手。也许只使用8或10,然后将其称为足够接近就可以了。当某些观点是负面的时该怎么办? 我可以看到Excel很好地解决了这个问题。 有谁知道解决该问题的通用算法(即使有些蛮力也可以)?我不必很快做,但看起来应该不错。
84 algorithm  math  graph 

4
连接所有岛屿的最低费用是多少?
有一个大小为N x M的网格。一些单元格是用“ 0”表示的岛,其他单元格是水。每个水电池上都有一个数字,表示在该水电池上建造一座桥的成本。您必须找到可以连接所有孤岛的最低成本。如果一个单元共享一条边或一个顶点,则该单元将连接到另一个单元。 可以使用什么算法解决此问题?如果N,M的值非常小(例如NxM <= 100),可以用作暴力破解方法? 示例:在给定的图像中,绿色单元格表示岛,蓝色单元格表示水,浅蓝色单元格表示应在其上架桥的单元格。因此,对于以下图像,答案将是17。 最初,我想到将所有岛屿标记为节点,并通过最短的桥梁连接每对岛屿。然后可以将问题简化为最小生成树,但是在这种方法中,我错过了边缘重叠的情况。例如,在下图中,任何两个岛之间的最短距离为7(以黄色标记),因此,通过使用最小生成树,答案将为14,但答案应为11(以浅蓝色标记)。

6
Viola-Jones的人脸检测宣称拥有18万个功能
我一直在实施Viola-Jones的人脸检测算法的改编。该技术依赖于在图像内放置一个24x24像素的子帧,然后在每个位置以各种尺寸放置矩形特征。 这些特征可以由两个,三个或四个矩形组成。提供以下示例。 他们声称穷举集超过18万(第2节): 假设检测器的基本分辨率为24x24,则详尽的矩形特征集非常大,超过180,000。请注意,与Haar基础不同,矩形要素集过于完整。 本文中未明确陈述以下陈述,因此它们是我的假设: 只有2个两个矩形的特征,2个三个矩形的特征和1个四个矩形的特征。其背后的逻辑是,我们正在观察突出显示的矩形之间的差异,而不是显式地观察颜色或亮度或任何类似的东西。 我们无法将要素类型A定义为1x1像素块;它必须至少为1x2像素。同样,类型D必须至少为2x2像素,并且该规则也适用于其他功能。 我们无法将要素类型A定义为1x3像素块,因为无法对中间像素进行分区,并且从自身中减去它就等于1x2像素块;仅为均匀宽度定义此要素类型。同样,要素类型C的宽度必须被3整除,并且该规则也适用于其他要素。 我们无法定义宽度和/或高度为0的要素。因此,我们将x和y迭代为24减去要素的大小。 基于这些假设,我计算了详尽的集合: const int frameSize = 24; const int features = 5; // All five feature types: const int feature[features][2] = {{2,1}, {1,2}, {3,1}, {1,3}, {2,2}}; int count = 0; // Each feature: for (int i = 0; i < features; i++) …

8
计算旧+ n米的新经度,纬度
我想基于坐标和以米为单位的距离创建2个新经度和2个新纬度,我想在某个点周围创建一个不错的边界框。它是城市的一部分,最大±1500米。因此,我认为不必考虑地球的曲率。 所以我有50.0452345(x)和4.3242234(y),我想知道x + 500米,x-500米,y-500米,y + 500米 我发现了很多算法,但几乎所有算法似乎都处理点之间的距离。

12
如何使用众包排序对一百万张图像进行排名
我想通过制作一个游戏来排名风景图像集,网站访问者可以对它们进行评分,从而找出人们最喜欢的图像。 这样做的一个好方法是什么? 流行与否?即显示单个图像,请用户将其排名为1-10。正如我所看到的,这使我可以平均分数,并且只需要确保我在所有图像上获得均匀的选票分配即可。实施起来相当简单。 选择A还是B?即显示两个图像,请用户选择更好的一个。这很有吸引力,因为没有数字排名,这只是一个比较。但是我将如何实施呢?我的第一个想法是将其作为快速排序,由人提供比较操作,完成后,只需重复无极排序即可。 你会怎么做? 如果您需要数字,那么我说的是每天访问量为20,000次的网站上的一百万张图片。我猜想为了争辩,一小部分人可能会玩游戏,可以说我一天可以进行2,000次人工排序操作!这是一个非营利性网站,终极好奇者会通过我的个人资料找到它:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.