Bir Array qarışdırın

Çətinlik səviyyəsi Mühit
Tez-tez soruşulur Amazon Facebook google microsoft Kahin
Geyim Sükut HashingBaxılıb 33

N elementi olan bir sıra və ya set verilmişdir. Burada elementlər bənzərsizdir və ya təkrar yoxdur. Qarışdırın array(və ya çoxluq) təkrarlanmayan nömrələr.

misal

// 2, 4, 3 və 1 dəsti ilə bir sıra başladın.

int [] nums = {2, 4, 3, 1};

Qarışdırmaq obyekti = yeni qarışdırmaq (say);

// Dizini qarışdırın [2, 4, 3, 1] və nəticəsini qaytarın. Hər hansı bir [2, 4, 3, 1] permütasiyasının qaytarılması ehtimalı bərabər olmalıdır, məsələn [4, 2, 1, 3] object.shuffle ();

// Massivi, yəni serialın orijinal konfiqurasiyasına qaytarır [2, 4, 3, 1].

solution.reset ();

Bunu iki hashmap istifadə edərək O (n) zaman mürəkkəbliyində istifadə edərək edə bilərik.

Bir Dizini qarışdırmaq üçün istifadə edilən məlumat strukturları

Xəritə M (dəyər, indeks cütü saxlamaq üçün)

Xəritə K (dəyəri saxlamaq üçün, dəyişən indeks)

Dizidəki mövcud elementləri saxlamaq üçün vektor arr.

Misal üçün:

Bir Array qarışdırınPin

Konstruktor funksiyası üçün alqoritm

  1. Verilən massivdə mövcud olan hər bir element üçün nömrə:
    1. arr [i] = nums [i]
    2. əsas dəyər cütünü (nums [i], i) K-yə daxil edin.
    3. əsas dəyər cütünü (nums [i], i) M-ə daxil edin.

Sıfırlama alqoritmi ()

  1. M xəritəsində mövcud olan hər bir giriş üçün (iterator):
    1. arr [it.second] = arr [it.first], vektoru orijinal dəyərlərlə yeniləyin.
  2. Arr qayıt.

Qarışdırmaq üçün alqoritm ()

  1. N-dən 0-a qədər bir döngə işlədin:
    1. (0, n) aralığında təsadüfi bir indeks (indeks) seçin.
    2. İndeksdə olan elementi götürün və massivdəki son elementlə dəyişdirin.
    3. X xəritəsindəki indeks elementi və son element üçün hash dəyərlərini yeniləyin.
  2. Arr qayıt.

Həyata keçirilməsi

Bir Array qarışdırmaq üçün C ++ proqramı

#include<bits/stdc++.h>
using namespace std;
class Shuffle {
public:
    vector<int> arr;
    unordered_map<int,int> m;
    unordered_map<int,int> k;
    Shuffle(vector<int>& nums) {
        for(int i=0;i<nums.size();i++){
            arr.push_back(nums[i]);
            m.insert({nums[i],i});
            k.insert({nums[i],i});
        }
    }
    /** Resets the array to its original configuration and return it. */
    vector<int> reset() {
        for(auto it:m){
            arr[it.second]=it.first;
        }
        return arr;
    }
    
    /** Returns a random shuffling of the array. */
    vector<int> shuffle() {
        int n=arr.size();
        while(n){
            int in=rand()%n;
            int index= k[arr[n-1]];
            k[arr[n-1]]=k[arr[in]];
            k[arr[in]]=index;
            swap(arr[in],arr[n-1]);
            n--;
        }
        return arr;
    }
};

int main()
{
    vector<int> nums = {2,3,4,1,5,6};
    Shuffle* obj = new Shuffle(nums);
    cout<<"Original array:\n";
    for(int i=0;i<nums.size();i++){
        cout<<nums[i]<<" ";
    }
    vector<int> _shuffle = obj->shuffle();
    cout<<"\nArray after shuffle:\n";
    for(int i=0;i<_shuffle.size();i++){
        cout<<_shuffle[i]<<" ";
    }
    vector<int> _reset = obj->reset();
    cout<<"\nArray after reset:\n";
    for(int i=0;i<_reset.size();i++){
        cout<<_reset[i]<<" ";
    }
    return 0;
}
Original array:
2 3 4 1 5 6 
Array after shuffle:
2 4 1 5 6 3 
Array after reset:
2 3 4 1 5 6 

Bir Array qarışdırmaq üçün JAVA proqramı

import java.util.*;
class Shuffle {
    HashMap<Integer, Integer> m,k;
    int[] arr;

    public Shuffle(int[] nums) {
        m = new HashMap<>();
        k = new HashMap<>();
        int n=nums.length;
        arr = new int[n];
        for(int i=0;i<n;i++){
            arr[i]=nums[i];
            m.put(nums[i],i);
            k.put(nums[i],i);
        }
    }
    
    /** Resets the array to its original configuration and return it. */
    public int[] reset() {
        for(Map.Entry<Integer, Integer> it : m.entrySet()){
            arr[it.getValue()]=it.getKey();
        }
        return arr;
    }
    
    /** Returns a random shuffling of the array. */
    public int[] shuffle() {
        int n=arr.length;
        Random rand = new Random(); 
        while(n>0){
            int in=rand.nextInt(n);
            int index = k.get(arr[n-1]);
            k.put(arr[n-1],k.get(arr[in]));
            k.put(arr[in],index);
            int temp = arr[in];
            arr[in] = arr[n-1];
            arr[n-1] = temp;
            n--;
        }
        return arr;
    }
}
public class Main
{
  public static void main(String[] args) {
      int[] nums = {2,3,4,6};
        Shuffle obj = new Shuffle(nums);
        System.out.print("Original array:\n");
        for(int i=0;i<nums.length;i++){
            System.out.print(nums[i]+" ");
        }
        int[] _shuffle = obj.shuffle();
        System.out.print("\nArray after shuffle:\n");
        for(int i=0;i<_shuffle.length;i++){
            System.out.print(_shuffle[i]+" ");
        }
        int[] _reset = obj.reset();
        System.out.print("\nArray after reset:\n");
        for(int i=0;i<_reset.length;i++){
            System.out.print(_reset[i]+" ");
        }
  }
}
Original array:
2 3 4 6 1 0 1 0 
Array after shuffle:
4 6 2 3 
Array after reset:
2 3 4 6 

Bir Array qarışdırmaq üçün Mürəkkəblik Analizi

Zaman mürəkkəbliyi

O (n) bütün funksiya, yəni Constructor funksiyası, shuffle (), reset (), çünki bütün funksiyalar yalnız bir dəfə massivin keçməsinə ehtiyac duyur. Buna görə bizi xətti zaman mürəkkəbliyinə aparır.

Kosmik mürəkkəblik

O (n), dəyər indeksi cütünü saxlamaq üçün n ölçülü 2 köməkçi hashmap-ə ehtiyacımız var.

References

Translate »