我找到了这个面试问题,我无法想出一个比O(N ^ 2*P)好的算法:
给定P自然数(1,2,3,...,P)的向量和另一个长度为N的向量,其元素来自第一个向量,找到第二个向量中最长的子序列,使得所有元素均匀分布(频率相同).
例如:(1,2,3)和(1,2,1,3,2,1,3,1,2,3,1).最长的子序列在区间[2,10]中,因为它包含来自具有相同频率的第一序列的所有元素(1出现三次,两次三次,三次三次).
时间复杂度应为O(N*P).
因此,我试图理解SVM算法是如何工作的,但我无法弄清楚如何在n维平面的点上转换一些具有数学意义的数据集,以便通过超平面分离点并对它们进行分类.
这里有一个例子在这里,他们正试图clasify老虎和大象的照片,他们说:"我们的数字化他们到100×100像素的图片,所以我们在n维平面,其中n = 10,000×",但我的问题是怎么做的,他们转换实际上只代表一些颜色代码的矩阵IN具有数学意义的点,以便将它们分为两类?
可能有人可以在2D示例中向我解释这一点,因为任何图形表示我都认为它只是2D,而不是nD.
可以有人给我一个例子,说明我们如何使用像群,幺半群和环这样的代数结构来提高代码的可重用性吗?(或者我如何在编程中使用这些结构,至少知道我没有在高中学习所有的理论).
我听说这是可能的,但是我无法想出在编程中应用它们并在编程中应用硬核数学的方法.
2D数组如何存储在内存中?
我想到了以下方法,其中行存储为重要的内存块.
| _ __ _ __ _ __ || _ __ _ __ _ __ |__ _ __ _ __| _ __ _ __ _ _ | ... | _ __ _ __ _ __ |
这些元素像(i,j) - > n*i + j一样被加入,其中n是矩阵的维数(假设它是nxn).
但是,如果我想添加一个新列怎么办?我必须更新每一行中的每个第(n + 1)个元素,并将它们移到右边,但这在计算上太昂贵了.
另一种选择是将矩阵复制到新位置,并使用新列的元素动态更新行.但如果阵列很大,这也不太有效.
最后我想到的第三个选项是为每一行分配一个固定数量的内存,当我添加一个新列时,我不必将行向右移动.
我不能在内存中留有空隙,所以所有块都必须是连续的.
我不是要求使用指针和实际RAM内存的C实现,我只是对在内存中存储动态2d数组的理论方法感到好奇,因此很容易为其添加新的行或列.
还有其他更有效的方法吗?