Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 分治-复数数组_Algorithm - Fatal编程技术网

Algorithm 分治-复数数组

Algorithm 分治-复数数组,algorithm,Algorithm,我想设计一个算法,确定数组A是否为复数,并返回该元素 如果数组的一半以上与x相同,则当数组中存在元素x时,数组为复数 我想知道是否有一种更有效的分治算法比我现在的算法运行得更好 Assume you have the array aaabbcac 我将递归地拆分数组,直到得到大小为2的子数组,如下所示 aa ab bc ac 从这里开始,我将比较子阵列中的每个元素,看看它们是否相等: 如果相等,则返回元素, 否则,返回false aa ab bc ac a f f f 现在我有

我想设计一个算法,确定数组A是否为复数,并返回该元素

如果数组的一半以上与x相同,则当数组中存在元素x时,数组为复数

我想知道是否有一种更有效的分治算法比我现在的算法运行得更好

Assume you have the array

aaabbcac
我将递归地拆分数组,直到得到大小为2的子数组,如下所示

aa ab bc ac
从这里开始,我将比较子阵列中的每个元素,看看它们是否相等: 如果相等,则返回元素, 否则,返回false

aa ab bc ac 
a  f   f  f
现在我有了一个元素A和3的数组false

我正在考虑这样组合它们:

a  f  f  f
  a     f  <----- combining a and f will give a
     a    <----- returns a
af

a f这是计算
x
出现次数的问题。将阵列拆分为子阵列,并将
x
与子阵列一起发送。返回count、sum counts并检查其是否大于数组的大小。

您还可以通过某种排序算法(如快速排序)对数组进行排序,在循环之后,通过检查N+1元素是否与N相同,直到(N+1)/2元素。
当使用快速排序时,这种方法将具有复杂性
O(n*logn+n/2)
。因此,基本上我的算法将受到排序速度的限制。

因为这是家庭作业,这里有一些线索-你应该能够轻松地证明这些并完成问题

  • 单个元素数组通常有一个复数元素
  • 一个数组最多有一个复数元素,假设它存在并称之为x
  • 如果将数组分成两半,x将是至少一个两半的复数元素

什么意思?将x与子数组一起发送?而不是发送子数组,如
aa ab bc ac
发送子数组的元组和元素
(aa,a)、(ab,a)、(bc,a)、(ac,a)
啊,我明白了。这意味着,我和子数组一起发送的x将是一个随机元素,或者是子数组中的元素,在这个例子中,它将是用来决定数组是否为复数的元素,不是吗?但我们没有得到元素。给定一个数组,我们要找出它的复数和复数元素。它必须是分治方法吗?是的,我正在寻找分治算法。这是家庭作业吗?你非常接近……是的,这是家庭作业。但我很困惑如何从这里继续下去。有什么建议吗?关于一个O(n)算法,如果元素存在的话,它可以找到元素。啊,我明白了。。但是假设我只能基于相等性比较数组中的元素。也就是说,我无法确定元素之间是小于还是大于。还有,有没有可能让algo是分治型的?好的。似乎我们不能在这样的要求下使用排序方法。如果某个元素的相对频率大于0.5,那么这个数组就是复数数组。算法复杂性将取决于直方图表查找/插入复杂性。或者这种方法是否也违反了“不少于/多于运算符”规则?(因为我们仍然需要检查频率是否大于0.5):-)如果元素具有可比性,则算法不受排序速度的限制。我认为我们彼此理解错误。通过说有界于排序速度,我的意思是快速排序平均复杂度为n*logn,大于n/2。所以主要的瓶颈是我建议的方法的排序速度。我编辑了你的答案,删除了下一票,可能是我的编辑错误,但我想你应该说你的算法受排序速度的限制,而不是所有的算法。嗨,克里斯!这就是我目前得到的。要求它是一个分而治之的算法。因此,我将把数组分成两个元素的子数组。”比较这两个元素,如果相等,则将其存储在另一个数组中。如果不相等,则丢弃这两个元素。'检查完所有元素后,我将有一个新数组。在这个例子中,我给出了“aa-ab-bc-ac==>在新数组中有a的结果”。但是由于数组中只有4个a,所以它不是复数数组。因此,我必须再次检查数组,以验证该元素是否为复数元素。那么,验证的O(n)会限制算法的复杂性吗?或者是O(nlgn),因为算法的除法阶段。你太接近了。您将始终必须再次运行阵列以进行检查。例如,如果您的数组是aaaabbbb,并且您将其分解并征服为aaaa | bbbbbb,则这些子数组是复数(a和b),并且您必须计算a和b的数量,以验证原始数组中两者都不是复数。你是对的,这是O(n lg n)-这是验证步骤(验证多达n个元素,在多达lg n个细分级别)。我认为你试图在“分而治之”问题上看得太远了。aaaabbbb不关心“叶”节点,它只关心aaaa和bbbb的两半以及它们的
findPluralElement()
将返回什么。你只需要考虑最多两个候选人,而不是(n/2)。你将一路分崩离析,直到1到2个因素。但是,你在那里得到的任何结果都不会一直冒泡到顶端。您的8号套装不需要使用2号套装。我能解释这一切的最好办法就是写下答案。。。但这不公平;)