【问题标题】:Trying to improve efficiency of this search in an array试图在数组中提高此搜索的效率
【发布时间】:2015-06-05 17:26:27
【问题描述】:

假设我有一个输入数组,其中所有对象都是不等价的 - 例如[13,2,36]。我希望输出数组为[1,0,2],因为13大于2所以“1”,2大于没有元素所以“0”,36大于13和2所以“2”。如何获得效率高于 O(n2) 的输出数组? 编辑 1:我还想以相同的顺序打印输出。如果可能的话,给出一个 c/c++ 代码。

【问题讨论】:

  • [13, 13, 2, 36] 的输出应该是什么?
  • 不完全是骗子,但你可以在那里看到我的答案stackoverflow.com/questions/30655250/…
  • 听起来像功课
  • @Kevin 很好的问题!我的倾向是 [1,1,0,2] 但谁知道它是否应该是 [2,1,0,3] ! LTR
  • 通过使用来自 github 的处理排序的良好框架,您可以获得效率高于 O(n2) 的数组输出;)

标签: algorithm sorting stl


【解决方案1】:

看起来像一个动态规划。 可能这会有所帮助 这是一个 O(n) 算法

1.声明一个say max size say 1000001的数组;

2.遍历所有元素,使 arr[input[n]]=1 其中 input[n] 为元素

3.遍历arr并与之前的索引相加(保持arr[i]大于多少元素的记录)这样

  arr[i]+=arr[i-1]

示例:如果输入[]={12,3,36}
第 2 步之后
arr[12]=1,arr[3]=1,arr[36]=1;
第 3 步之后
arr[3]=1,arr[4]=arr[3]+arr[4]=1(arr[4]=0,arr[3]=1),
arr[11]=arr[10]=arr[9]=arr[8]=arr[7]arr[6]=arr[5]=arr[4]=1
arr[12]=arr[11]+arr[12]=2(arr[11]=1,arr[12]=1)
arr[36]=arr[35]+arr[36]=3(因为arr[13],arr[14],...arr[35]=2 and arr[36]=1)

4.遍历输入数组打印arr[input[i]]-1,其中i是索引。

所以 arr[3]=1,arr[12]=2,arr[36]=3;
如果您打印 arr[input[i]] 则输出将为 {2,1,3} 因此我们需要从每个元素中减去 1 然后输出变为 {1,0,2} 这是您想要的输出。

//伪代码

int arr[1000001];
int input[size];//size is the size of the input array
for(i=0;i<size;i++)
     input[i]=take input;//take input
     arr[input[i]]=1;//setting the index of input[i]=1; 
for(i=1;i<1000001;i++)
     arr[i]+=arr[i-1];

for(i=0;i<size;i++)
    print arr[input[i]]-1;//since arr[i] was initialized with 1 but you want the input as 0 for first element(so subtracting 1 from each element)

为了更好地理解算法,拿纸和笔进行试运行。这将有助于更好地理解。

希望对你有帮助 快乐编码!

【讨论】:

    【解决方案2】:

    克隆原始数组(并将元素的原始索引保留在某处)并对其进行快速排序。快速排序数组中元素的值应为quicksorted.length - i,其中i是新快速排序数组中元素的索引。

    [13, 2, 36] - original
    [36(2), 13(1), 2(0)] - sorted
    [1, 0, 2] - substituted
    

    【讨论】:

    • 如何替换它?
    【解决方案3】:
    def sort(array):
        temp = sorted(array)
        indexDict = {temp[i]: i for i in xrange(len(temp))}
        return [indexDict[i] for i in array]
    

    我知道它是在 python 中的,但仍然可以帮助你

    【讨论】:

      【解决方案4】:

      Schwartzian 变换:装饰、排序、取消装饰。

      创建一个包含对象和索引的结构。从您的列表中创建这些结构的新列表。按计划按对象排序。从排序列表创建索引列表。

      【讨论】:

        猜你喜欢
        • 2010-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-17
        • 1970-01-01
        相关资源
        最近更新 更多