Array аралаштыруу


Кыйынчылык деңгээли орто
Көп суралган Amazon Facebook Гугл Microsoft Oracle
согуштук тизме таштанды Hashing

N элементтен турган массив же топтом берилген. Бул жерде элементтер уникалдуу же кайталоо жок. Аралаштыруу согуштук тизме(же топтому) кайталанбаган сандар.

мисал

// 2, 4, 3 жана 1 топтому менен массивди баштаңыз.

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

Аралаштыруу объектиси = жаңы Аралаштыруу (сан);

// Массивди аралаштырыңыз [2, 4, 3, 1] жана анын натыйжасын кайтарыңыз. [2, 4, 3, 1] ар кандай орун алмаштырылышы мүмкүн, мисалы [4, 2, 1, 3] object.shuffle ();

// Массивди баштапкы конфигурациясына кайтарат, б.а., [2, 4, 3, 1].

solution.reset ();

Биз муну O (n) убакыттын татаалдыгында эки хешмапты колдонуу менен жасай алабыз.

Массивди аралаштыруу үчүн колдонулган маалымат структуралары

Карта M (маанини сактоо үчүн, индекс жупу)

Карта K (маанини сактоо үчүн, индекстин өзгөрүшү)

Массивдеги учурдагы элементтерди сактоо үчүн вектордук арр.

Мисалы:

Array аралаштыруу

Конструктор функциясы үчүн алгоритм

  1. Берилген массивдеги ар бир элемент үчүн:
    1. arr [i] = nums [i]
    2. негизги маанинин жупун киргизиңиз (nums [i], i) K ичине.
    3. ачкыч маанисинин жупун киргизиңиз (nums [i], i) M.

Баштапкы абалга келтирүү алгоритми ()

  1. M картасына кирген ар бир жазуу үчүн (итератор):
    1. arr [it.second] = arr [it.first], векторду баштапкы баалуулуктар менен жаңыртыңыз.
  2. Артка кайтуу.

Аралаштыруу алгоритми ()

  1. Н ден 0 чейин цикл иштетүү:
    1. (0, n) диапазонунда туш келди индексти (индексти) тандаңыз.
    2. Индекстеги элементти алып, аны массивдеги акыркы элемент менен алмаштырыңыз.
    3. К картасындагы индекс элементи жана акыркы элемент үчүн таштанды маанисин жаңыртыңыз.
  2. Артка кайтуу.

ишке ашыруу

Shuffle an Array үчүн C ++ программасы

#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 

Shuffle an Array үчүн JAVA программасы

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 

Array аралаштыруу үчүн татаалдыкты талдоо

Убакыттын татаалдыгы

O (n) бардык функция, б.а. Конструктор функциясы, shuffle (), reset (), анткени бардык функциялар массивди бир жолу өтүш керек. Ошондуктан бизди убакыттын сызыктуу татаалдыгына алып барат.

Космостун татаалдыгы

O (n), бизге маанинин индекси жупту сактоо үчүн n өлчөмүндөгү 2 көмөкчү хэшмап керек.

шилтемелер