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.
Mündəricat
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:
Konstruktor funksiyası üçün alqoritm
- Verilən massivdə mövcud olan hər bir element üçün nömrə:
- arr [i] = nums [i]
- əsas dəyər cütünü (nums [i], i) K-yə daxil edin.
- əsas dəyər cütünü (nums [i], i) M-ə daxil edin.
Sıfırlama alqoritmi ()
- M xəritəsində mövcud olan hər bir giriş üçün (iterator):
- arr [it.second] = arr [it.first], vektoru orijinal dəyərlərlə yeniləyin.
- Arr qayıt.
Qarışdırmaq üçün alqoritm ()
- N-dən 0-a qədər bir döngə işlədin:
- (0, n) aralığında təsadüfi bir indeks (indeks) seçin.
- İndeksdə olan elementi götürün və massivdəki son elementlə dəyişdirin.
- X xəritəsindəki indeks elementi və son element üçün hash dəyərlərini yeniləyin.
- 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.