1
4
对于一个小的数组(如果你想要前20个元素,平均有10个元素可以检查是否相等),线性扫描通常会执行二进制搜索,即使你不需要插入元素。 |
2
11
为什么不开始将数组元素插入std::set中,并在集合中有n个元素时停止?确保集合不存在重复项。它们也保证被排序,所以如果您从begin()到end()遍历一个集合,您将按照operator<的排序顺序进行排序。 |
3
4
你所施加的限制所能达到的最快时间复杂性是
因为您只处理“成千上万条记录”,所以任何其他内容都只是一个微不足道的添加。 |
4
4
我会尝试在一个不平衡的二叉树中去掉唯一性。这样可以节省重新排列uniques列表的成本,并且如果源列表足够随机,那么插入到树中不会使其严重失衡。(如果不是一个二叉树就可以进行搜索和插入。)如果它变得不平衡,那么最坏的情况将与迭代16个元素列表而不是进行二叉搜索相同。 你知道二叉树的最大大小,所以你可以提前预先分配所有必要的内存,所以这不应该是个问题。您甚至可以使用“我的节点内存不足”条件,让您知道何时完成。 (编辑:显然,人们认为我主张在这里使用例外。我不是。我可能提倡实际的通用Lisp样式条件,但在大多数语言中没有发现转义延续样式的异常。此外,看起来他想为此做C。) |
5
3
不要将唯一整数存储到数组中,而是使用实际的二叉树。这样可以避免重复移动数组元素。 |
6
3
使用二进制树的数组表示形式。阵列的大小可以是3N。基本上 ARR[i]=值 arr[i+1]=左子数组索引 arr[i+2]=右子数组索引 每次插入k时都要浏览“树”,如果找不到k,则更新其父级的[i+1]或[i+2]并将其添加到下一个空索引中。当数组空间用完时,就得到了答案。 例如 查找422433123的前3个唯一项:数组大小=3*3=9。 在下表中,“v”是值,“l”是左子索引,“r”是右子索引。
你的空间太大了。 数组索引0 mod 3是您的答案。 您可以使用4个组来保存顺序: 数组[i]=值 数组[I+1]=原始数组中的位置 数组[I+2]=左子索引 数组[I+3]=右子索引 |
7
2
如果你有数千个整数,并且每一个大约发生三次,你的算法应该很快找到n个唯一整数的集合,对于小的e(假设这些整数是相对随机的)大致按n(1+e)步进行。 这意味着您的算法将向uniques数组中插入n倍随机整数。在数组中平均移动k/2个元素时插入数字k,产生(n^2)/4个移动操作。您的二进制搜索大约需要N*(log(n)-1)个步骤。这将为您的算法生成(n^2)/4+n(log(n)-1)+n(1+e)的总复杂度。 我认为你可以通过以下方式更好:
由于运行内部循环(索引变量k)的概率较低,该算法将在预期时间n+n^2/128运行。 |
8
0
给定一个名为l、大小为n的整数列表 重复l一次以查找数组中的最大值和最小值。 分配(1个分配)大小为(小..的整数数组。大)名为A. 将此数组初始化为零 迭代l,使用l(i)下标到a中,增加在这里找到的整数。 然后进行处理。在L中选择你的起点,然后向前浏览列表,看a(i)。选择您想要的任何一组(i)>2。 完成后,处理。 如果您的空间确实很短,请使用2位而不是整数,解释如下
|
callum · 如何识别数组中与给定序列不匹配的元素? 1 年前 |
Sab · 输入为空时,搜索结果元素未隐藏 2 年前 |
Chaz Cosby · 如何添加更改api地址的搜索栏? 2 年前 |
user3669555 · 多维数组搜索部分单词或短语并移除键 6 年前 |
Yohan · 根据用户输入显示或隐藏div 6 年前 |
Shasocais · Prolog,基本情况失败的问题 6 年前 |
Den · C#在列表框中搜索项目1 6 年前 |
Eugene Barsky · Perl 6中多针的索引 6 年前 |