Questions tagged «arrays»

创建后通常不能更改其大小的顺序随机访问数据结构。

3
用于交织数组的就地算法
给你一个元素的数组2 n2ñ2n 一种1个,一2,... ,一ñ,b1个,b2,… bñ一种1个,一种2,…,一种ñ,b1个,b2,…bña_1, a_2, \dots, a_n, b_1, b_2, \dots b_n 任务是使用就地算法对数组进行交织,以使生成的数组看起来像 b1个,一1个,b2,一2,… ,bñ,一ñb1个,一种1个,b2,一种2,…,bñ,一种ñb_1, a_1, b_2, a_2, \dots , b_n, a_n 如果就地需求不存在,我们可以轻松地创建一个新数组并复制给出O(n )的元素O(n)Ø(ñ)\mathcal{O}(n)时间算法的。 根据就地需求,分而治之算法将算法提高为θ (Ñ 登录n )θ(ñ日志⁡ñ)\theta(n \log n)。 所以问题是: 是否有一个时间算法,它也就位?O(n)Ø(ñ)\mathcal{O}(n) (注意:您可以假设使用统一成本的WORD RAM模型,因此就地转换为空间限制)。O(1)Ø(1个)\mathcal{O}(1)

6
在(开放)源代码中保守字符串秘密
我已经完成了针对Android的应用开发,并打算使用GPL进行发布-我希望它是开源的。但是,应用程序(游戏)的性质是,它会询问谜语并将答案编码到字符串资源中。我无法发布答案!有人告诉我要安全地存储密码-但是我没有找到合适的密码。 是否可以使用隐藏,加密或其他方式隐藏的字符串数组来发布我的源代码?也许通过阅读在线数据库的答案? 更新资料 Yuval Filmus的以下解决方案有效。当我第一次阅读它时,我仍然不确定该怎么做。对于第二个选项,我找到了一些解决方案:将散列的解决方案存储在源中,并在用户每次猜测时计算散列。为此,请使用http://code.google.com/p/crypto-js/上的crypto-js库。对于Android,请使用MessageDigest函数。在fdroid / github上有一个名为HashPass的应用程序可以执行此操作。
50 arrays  security 


5
将元素添加到排序数组
最快的方法是什么(从算法的角度以及实际的角度来看)? 我在按照以下思路思考。 我可以添加到数组的末尾,然后使用Bubblesort,因为它的最佳情况(开始时是完全排序的数组)接近于此,并且具有线性运行时间(最佳情况)。 另一方面,如果我知道我是从排序数组开始的,则可以使用二进制搜索来查找给定元素的插入点。 我的直觉是,第二种方法几乎是最优的,但好奇地想知道那里有什么。 如何最好地做到这一点?

7
一个在两个数组中不同的元素。如何有效地找到它?
我正在准备进行编码面试,但我真的想不出解决此问题的最有效方法。 假设我们有两个数组,这些数组由未排序的数字组成。数组2包含一个数字,数组1没有。两个数组都有随机定位的数字,不一定以相同的顺序或相同的索引。例如: 阵列1 [78,11,143,84,77,1,26,35 .... n] 数组2 [11,84,35,25,77,78,26,143 ... 21 ... n + 1] 找到不同数字的最快算法是什么?它的运行时间是多少?在此示例中,我们要查找的数字是21。 我的想法是遍历数组1并从数组2中删除该值。迭代直到完成。这应该在O(nlogn)O(nlog⁡n)O(n \log n)运行时间左右,对吗?

3
是否有一种算法可以在
此问题是从理论计算机科学堆栈交换迁移而来的,因为可以在计算机科学堆栈交换上回答。 迁移 7年前。 我想证明或反对一种算法的存在,该算法在给定整数数组下找到三个索引和,使得且(或发现没有这样的三元组)线性时间。AAAi,ji,ji, jkkki&lt;j&lt;ki&lt;j&lt;ki < j < kA[i]&lt;A[j]&lt;A[k]A[i]&lt;A[j]&lt;A[k]A[i] < A[j] < A[k] 这不是一个作业问题。我在一个编程论坛上看到它是“尝试实现这种算法”。我怀疑经过各种实验后这是不可能的。我的直觉告诉我,但这并不算什么。 我想正式证明这一点。你怎么做呢?理想情况下,我希望逐步看到一个证明,然后,如果您愿意,可以对如何证明/证明这样的简单问题进行一些解释。如果有帮助,请举一些例子: [1,5,2,0,3] → (1,2,3) [5,6,1,2,3] → (1,2,3) [1,5,2,3] → (1,2,3) [5,6,1,2,7] → (1,2,7) [5,6,1,2,7,8] → (1,2,7) [1,2,999,3] → (1,2,999) [999,1,2,3] → (1,2,3) [11,12,8,9,5,6,3,4,1,2,3] → (1,2,3) [1,5,2,0,-5,-2,-1] → (-5,-2,-1) 我以为有人可以遍历,并且每次有一个(即我们当前的)时,我们都会创建一个新的三元组并将其推入数组。我们继续步进并比较每个三元组,直到完成其中一个三元组。所以,这就像,!但是我认为这比仅仅更复杂,因为在最坏的情况下,我们的三元组数组中三元组的数量将对应于输入列表的大小。AAAi&lt;ji&lt;ji < jjjj[1,5,2,0,-5,-2,-1] → 1..2.. -5.. -2.. -1[1,5,2,0,-5,-2,3,-1] …

1
是否存在固定大小的现有数据结构,如果插入了新元素,该结构将推出最旧/最后一个元素?
我正在寻找一个数据结构,如果插入了新元素,它将推出其最早/最后的元素。例如,让我们D代表结构。D包含3个类型Number D的默认值的元素将被初始化为1, 2和3。 d = [ 1 ,2 ,3 ]d=[1个,2,3]D = [1, 2, 3] 如果Number将包含值5的插入D,3则会将推出,而1和2会向右移。 d = [ 5 ,1 ,2 ]d=[5,1个,2]D = [5, 1, 2] 首先想到的是一个数组,但是定义不包括推送行为。

1
保存数组初始化
我最近读到,有可能不需要初始化数组,即可以使用它们而不必花费任何时间尝试将每个成员设置为默认值。即,您可以开始使用数组,就好像它已被默认值初始化一样,而不必初始化它。(对不起,我不记得我在哪里读到的)。 例如,为什么这可能令人惊讶: 假设您正在尝试为[ 1 ,n 2 ]范围内的整数的最坏情况O(1)O(1)\mathcal{O}(1)哈希表建模 (针对每个插入/删除/搜索)。[1,n2][1,n2][1, n^2] 您可以分配大小为位的数组,并使用各个位来表示哈希表中是否存在整数。注意:分配内存被视为O(1 )时间。n2n2n^2O(1)O(1)\mathcal{O}(1) 现在,如果您根本不必初始化此数组,则此哈希表上的任何说运算的序列现在都是最坏的情况O(n )。nnnO(n)O(n)\mathcal{O}(n) 因此,实际上,您有一个“完美的”哈希实现,对于操作序列,它使用Θ (n 2)空间,但运行时间为O(n )!nnnΘ(n2)Θ(n2)\Theta(n^2)O(n)O(n)\mathcal{O}(n) 通常,您会希望您的运行时至少与您的空间使用情况一样糟糕! 注意:上面的示例可能用于稀疏集或稀疏矩阵的实现,所以我想这不仅具有理论意义。 所以问题是: 如何有一个像数据结构这样的数组,使我们可以跳过初始化步骤?

3
可被n整除的最大和
我在StackOverflow上问了这个问题,但我认为这是一个更合适的地方。 这是算法概论课程中的一个问题: 您有aaa包含nnn正整数的数组a(该数组无需排序或元素唯一)。建议使用O(n)O(n)O(n)算法查找可被整除的元素的最大和nnn。 例如: a=[6,1,13,4,9,8,25],n=7a=[6,1,13,4,9,8,25],n=7a = [6, 1, 13, 4, 9, 8, 25], n = 7。答案是565656(与元件6,13,4,8,256,13,4,8,256, 13, 4, 8, 25) 这是比较容易找到它O(n2)O(n2)O(n^2)使用动态编程和存储与余最大的一笔0,1,2,...,n−10,1,2,...,n−10, 1, 2,..., n - 1。 另外,如果我们将注意力集中在元素的连续序列上,则可以通过存储部分和以n为模的总和来轻松地在O(n)O(n)O(n)时间内找到最佳的此类序列:让S [ i ] = a [ 0 ] + a [ 1 ] + ⋯ + 一个[ 我],对于每个剩余ř记住最大索引Ĵ使得小号[ Ĵ ] ≡ řnnnS[i]=a[0]+a[1]+⋯+a[i]S[i]=a[0]+a[1]+⋯+a[i]S[i]=a[0]+a[1]+\dots + …

9
如何在O(n)时间中找到5个重复值?
假设您有一个大小为的数组,其中包含从到(含)在内的整数,并且正好重复了5个。我需要提出一种算法,该算法可以找到O(n)时间中的重复数。我一生都无法想任何事情。我认为排序最好是O(n \ log n)?然后遍历数组将是O(n),从而导致O(n ^ 2 \ log n)。但是,我不确定是否需要排序,因为我已经看到一些棘手的东西,包括链接列表,队列,堆栈等。1n≥6n≥6n \geq 6111O (n )O (n log n )O (n )O (n 2 log n )n−5n−5n − 5O(n)O(n)O(n)O(nlogn)O(nlog⁡n)O(n\log n)O(n)O(n)O(n)O(n2logn)O(n2log⁡n)O(n^2\log n)

6
如何在一个数组中实现两个堆栈?
我首先要说这不是一个作业问题。我正在阅读算法简介-著名的CLRS文字,以成为更好的程序员。我正在尝试解决本书中自己提出的问题和练习。 我试图解决锻炼; Tibial 10.1-2从第10章基本数据结构从CLRS第二版。其状态如下: 说明如何在一个数组A [1..n]中实现两个堆栈,除非两个堆栈中的元素总数为n,否则两个堆栈都不会溢出。PUSH和POP操作应在O(1)时间中运行。 到目前为止,我想出的解决方案是: 让数组A [1..n]实现两个堆栈:S1 [1..i]和S2 [i..n]。 对于PUSH-S1和PUSH-S2操作,如果堆栈“已满”,则开始将元素推入另一个堆栈(例如,当尝试将新元素推入时,如果堆栈S1已满,则将该元素推入堆栈S2,反之亦然)。 这种方法的问题是我将无法可靠地进行POP-S1或POP-S2,因为无法“记住”哪个元素属于哪个堆栈。如果堆栈的元素是(键,值)对,键是堆栈号,那么要弹出一个元素,在最坏的情况下,我必须搜索i或(ni)次-这将是O(n )(如果我在这里错了,请随时纠正我),它不是O(1)。 我已经在这个问题上花了很长时间了。我在正确的轨道上吗?有人可以给我解决该问题的可能指示吗? 通常,我应该如何“思考”这些问题?还是只有真正有才智的人才能解决这类问题?解决/解决此类问题(例如获得经验)是否可以帮助我变得更好? 我在等待启蒙。

1
计算反转对
分而治之的经典应用是解决以下问题: 给定不同的可比较元素的数组,计算数组中的反转对的数量:对,使得和。a[1…n]a[1…n]a[1\dots n](i,j)(i,j)(i,j)a[i]&gt;a[j]a[i]&gt;a[j]a[i] \gt a[j]i&lt;ji&lt;ji \lt j 一种解决方法是进行合并排序,但还要计算子问题中反转对的数量。在合并步骤中,我们计算跨越(两个)子问题的反转对的数量,并将其添加到子问题的计数中。 虽然这很好,并且给出了时间算法,但是却弄乱了数组。O(nlogn)O(nlog⁡n)O(n\log n) 如果我们还有其他限制,即数组是只读的,则可以制作一个副本并处理该副本,或者使用其他数据结构(例如订单统计平衡二叉树)进行计数,两者都使用空间。Θ(n)Θ(n)\Theta(n) 当前的问题是在不影响运行时间的情况下尝试改善空间。即 是否存在时间算法来计算反转对的数量,该算法适用于只读数组并使用亚线性(即)空间?O(nlogn)O(nlog⁡n)O(n\log n)o(n)o(n)o(n) 假设一个成本均一的RAM模型,并且元素占用空间,并且它们之间的比较为。O(1)O(1)O(1)O(1)O(1)O(1) 参考会做,但是一个解释会更好:-) 我尝试在网上搜索,但找不到任何肯定/否定答案。我想这只是出于好奇。

7
为什么负数组索引有意义?
我在C编程方面遇到了奇怪的经历。考虑以下代码: int main(){ int array1[6] = {0, 1, 2, 3, 4, 5}; int array2[6] = {6, 7, 8, 9, 10, 11}; printf("%d\n", array1[-1]); return 0; } 编译并运行此程序时,没有任何错误或警告。正如我的讲师所说,数组索引-1访问另一个变量。我仍然很困惑,为什么编程语言具有这种能力?我的意思是,为什么要允许使用负数组索引?

1
溢出安全求和
假设我给了固定宽度的整数(即它们适合宽度w的寄存器),a_1,a_2,\点a_n,使得它们的和a_1 + a_2 + \ dots + a_n = S也适合宽度w的寄存器。nnna 1,a 2,… a n a 1 + a 2 + ⋯ + a n = S wwwwa1,a2,…ana1,a2,…ana_1, a_2, \dots a_na1+a2+⋯+an=Sa1+a2+⋯+an=Sa_1 + a_2 + \dots + a_n = Swww 在我看来,我们总是可以将数字置换为b1,b2,…bnb1,b2,…bnb_1, b_2, \dots b_n,以便每个前缀和Si=b1+b2+⋯+biSi=b1+b2+⋯+biS_i = b_1 + b_2 + \dots + b_i也适合宽度为w的寄存器www。 …

1
计算来自数组的连续子数组的和数
我们给出阵列与所有一个[ 我] &gt; 0。a [ 1 … n ]a[1…n]a[1 \ldots n]a [ i ] &gt; 0a[i]&gt;0a[i]>0 现在我们需要找到可以从其子数组中形成多少个不同的总和(其中,子数组是该数组的连续范围,即,对于某些j ,k的,总和是所有子数组的元素)。例如,如果一个= [ 1 ,2 ,1 ],则答案为4:我们可以形成1 ,2 ,3 ,4。a [ j … k ]a[j…k]a[j\ldots k]Ĵ ,ķj,kj,k一个= [ 1 ,2,1 ]a=[1,2,1]a=[1,2,1]1 ,2 , 3 ,41,2,3,4 1,2,3,4 我知道如何计算时间中不同总和的数量。Ø (ñ2)O(n2)O(n^2) 此外,我已经意识到这与经典问题类似,在经典问题中,我们需要找到字符串的不同子字符串的数量。我正在考虑构造后缀数组并以类似的方式(以时间)解决它的可能性。但是我还无法弄清楚如何对其进行修改以在这里工作。例如,如果我们使用后缀数组为一个= [ 1 ,2 ,1 ],我们将得到5案件代替的四个上可接受的那些。是否可以使用后缀数组来做到这一点,或者我在想错方向吗?Ø …

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.