modo efficiente per contare il numero di swap nell'ordinamento per inserzione

0

Sto navigando su una sfida online di codifica online e sono stato colpito da qualche parte. Obiettivo del programma è trovare il numero massimo di swap richiesto nell'ordinamento di un array tramite l'ordinamento per inserzione in tempo efficiente

il primo approccio che è l'approccio a forza bruta dà la complessità di O (n ^ 2)

Il prossimo che posso pensare è un algoritmo di merge sort il codice che uso per questo è

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int mergesort(int *,int);
int _mergesort(int *,int *,int,int);
int merge(int *,int *,int,int,int);

int mergesort(int arr[],int n)
{
    int temp[n];
    return _mergesort(arr,temp,0,n-1);
}

int _mergesort(int arr[],int temp[],int left,int right)
{
    int mid,count=0;
    if(right>left)
    { 
      mid=(left+right)/2;
      count=_mergesort(arr,temp,left,mid);
      count+=_mergesort(arr,temp,mid+1,right);
      count+=merge(arr,temp,left,mid+1,right);
    }
    return count;
}

int merge(int arr[],int temp[],int left,int mid,int right)
{
  int i, j, k;
  int count = 0;
  i = left; 
  j = mid;  
  k = left; 
  while ((i <= mid - 1) && (j <= right))
  {
    if (arr[i] <= arr[j])
    {
      temp[k++] = arr[i++];
    }
    else
    {
      temp[k++] = arr[j++];
      count = count + (mid - i);
    }
  }
  while (i <= mid - 1)
    temp[k++] = arr[i++];
  while (j <= right)
    temp[k++] = arr[j++];
  for (i=left; i <= right; i++)
    arr[i] = temp[i];

  return count;
}

int main()
{
    int n,tc,i;
    cin>>tc;
    while(tc)
    {
      cin>>n;
      int arr[n];
      for(i=0;i<n;i++)
          cin>>arr[i];  
      cout<<mergesort(arr,n);
      tc--;
    }
    return 0;   
}

The example test case is 
Sample Input:
2
5
1 1 1 2 2
5
2 1 3 1 2

Sample Output:
0
4

questo mi dà una complessità di nlogn Inizialmente il programma legge il numero di test case che è 2 e seguito da due test case

l'algoritmo funziona bene per un piccolo intervallo di valori ma mostra il limite di tempo superato errore in alcuni casi di test.

Qual è il modo più efficace per farlo, non posso trovare alcun suggerimento o le modifiche sarebbero apprezzate.

    
posta prateeak ojha 02.10.2013 - 21:32
fonte

2 risposte

2

La chiave di questo problema non è cercare di trovare la situazione peggiore, ma piuttosto trovare il modello per poter creare la funzione sorts(x) = maximum number of sorts for an array of length x .

L'ordinamento di inserimento è una delle forme "facili" di una rete di smistamento . Una rete di ordinamento per un ordinamento di inserzione assomiglia a:

Ogni riga è un confronto e uno scambio possibile. Confronta il secondo e il primo posto. Forse scambiare. Quindi confronta il terzo e il secondo, quindi il secondo e il primo. ecc ...

Per inciso, ecco come appare un ordinamento di bolle in una rete di smistamento.

E se puoi fare confronti paralleli (l'intero punto della rete di smistamento) ... sembrano entrambi:

Guardando solo le linee, questo è un triangolo ...

2: .
3: ..
4: ...
5: ....
  • Per un array di dimensione 2, è necessario un confronto.
  • Per una matrice di dimensione 3, devi ordinare una matrice di dimensione 2 e fare altri due confronti.
  • Per un array di dimensione 4, devi ordinare una matrice di dimensione 3 e fare altri 3 confronti.
  • Per una serie di dimensioni X, devi ordinare una matrice di dimensioni x-1 e fare più confronti x-1.

La sequenza è: 1, 3, 6, 10, ...

Questa è una sequenza ben nota - (n * (n+1))/2

Ricordando che questo inizia da 2 anziché da 1 ...

sorts(x) = ((x - 1) * x)/2

    
risposta data 02.10.2013 - 22:16
fonte
0

Puoi creare un albero statistico di ordine dall'albero nero rosso e non dall'albero binario perché ciò fallirà in caso di inserimento di chiavi di moda ordinate.

Quindi puoi implementare Rank(T,x) per trovare la posizione x del nodo nell'albero corrente. Questo sarà un rango indicizzato.

Quindi nessuno degli elementi maggiori di questo sarà N-Rank(T,x) dove N è il numero totale di nodi. Questo è il no che deve passare subito.

quindi

swaps=0;
for all keys in array{
  insert in Order statistic Tree;
  g=current one based index-Rank(key);
  count+=g;
}

il conteggio è la tua risposta.

    
risposta data 28.01.2015 - 11:40
fonte

Leggi altre domande sui tag