TIO এ জাভা 7+, n = 50 ~ 30 সেকেন্ডে
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.Random;
class Main{
public static void main(String[] a){
int n=50;
Random randomGenerator = new Random();
int i = n+1;
int squaredN = n*n;
int[]randomIntegers = new int[i];
randomIntegers[n] = squaredN;
while(true){
for(i=n; i-->1; ){
randomIntegers[i] = randomGenerator.nextInt(squaredN);
}
Set<Integer> result = new HashSet<>();
Arrays.sort(randomIntegers);
for(i=n; i-->0; ){
result.add(randomIntegers[i+1] - randomIntegers[i]);
}
if(!result.contains(0) && result.size()==n){
System.out.println(result);
return;
}
}
}
}
এই চ্যালেঞ্জের কোড-গল্ফ সংস্করণের জন্য আমার জবাবের অবিস্মরণীয় সংস্করণ আপাতত কেবলমাত্র একটি ছোটখাটো পরিবর্তন: এটি পরিসরে পূর্ণসংখ্যার java.util.Random#nextInt(limit)
পরিবর্তে ব্যবহৃত হয় , কারণ এটি প্রায় দ্বিগুণ দ্রুত ।(int)(Math.random()*limit)
[0, n)
এটি অনলাইনে চেষ্টা করুন।
ব্যাখ্যা:
পদ্ধতির ব্যবহার:
কোডটি দুটি ভাগে বিভক্ত:
n
যোগফলের পূর্ণসংখ্যার পরিমাণের তালিকা তৈরি করে n squared
।
- তারপরে এটি যাচাই করে যে সমস্ত মানগুলি অনন্য এবং কোনওটি শূন্য নয় এবং যদি এটি মিথ্যা হয় তবে এটি ফলাফল না হওয়া পর্যন্ত ধুয়ে ফেলা এবং পুনরাবৃত্তি করবে।
পদক্ষেপ 1 নিম্নলিখিত উপ-পদক্ষেপের সাহায্যে সম্পন্ন করা হয়েছে:
1) n-1
পরিসীমাটিতে এলোমেলো সংখ্যার পরিমাণের একটি অ্যারে তৈরি করুন [0, n squared)
। এবং Add 0
এবং n squared
এই তালিকায়। এটি O(n+1)
পারফরম্যান্সে সম্পন্ন হয় ।
2) তারপরে এটি বিল্টিনের সাথে অ্যারে বাছাই করবে, ডক্সে যেমন বলা হয়েছে তেমনটি পারফরম্যান্সে java.util.Arrays.sort(int[])
সম্পন্ন হবে O(n*log(n))
:
ইনটসের নির্দিষ্ট অ্যারেটিকে আরোহণের সংখ্যার ক্রমে সাজান। বাছাই করা অ্যালগরিদমটি একটি সুরযুক্ত কুইকোর্ট, যা জন এল। বেন্টলি এবং এম। ডগলাস ম্যাকল্রয়ের "ইঞ্জিনিয়ারিং এ একটি সাজানো ফাংশন", সফ্টওয়্যার-অনুশীলন এবং অভিজ্ঞতা, খণ্ড। 23 (11) পি 1249-1265 (নভেম্বর 1993)। এই অ্যালগরিদম অনেক ডেটা সেটগুলিতে এন * লগ (এন) পারফরম্যান্স সরবরাহ করে যা অন্যান্য কোকোর্টগুলি চতুষ্পদ পারফরম্যান্সে অবনমিত করে।
3) প্রতিটি জুটির মধ্যে পার্থক্য গণনা করুন। পার্থক্যের এই ফলস্বরূপ তালিকায় n
যোগফলগুলি যোগ হবে n squared
। এটি O(n)
পারফরম্যান্সে সম্পন্ন হয় ।
এখানে একটি উদাহরণ:
// n = 4, nSquared = 16
// n-1 amount of random integers in the range [0, nSquared):
[11, 2, 5]
// Add 0 and nSquared to it, and sort:
[0, 2, 5, 11, 16]
// Calculate differences:
[2, 3, 6, 5]
// The sum of these differences will always be equal to nSquared
sum([2, 3, 6, 5]) = 16
সুতরাং উপরোক্ত এই তিনটি পদক্ষেপটি পারফরম্যান্সের জন্য বেশ ভাল, দ্বিতীয় ধাপ এবং সম্পূর্ণ জিনিসটির লুপের বিপরীতে যা একটি মৌলিক জন্তু-শক্তি। পদক্ষেপ 2 এই উপ-পদক্ষেপে বিভক্ত:
1) পার্থক্য তালিকা ইতিমধ্যে একটি এ সংরক্ষণ করা হয় java.util.Set
। এই সেটটির আকার সমান কিনা তা এটি পরীক্ষা করবে n
। যদি এটি হয় তবে এর অর্থ আমাদের উত্পন্ন সমস্ত এলোমেলো মানগুলি অনন্য unique
2) এবং এটি চেক করবে যে এটা কোন ধারণ করে 0
যেহেতু চ্যালেঞ্জ সীমার মধ্যে র্যান্ডম মানের জন্য জিজ্ঞেস করল, সেটে [1, X]
, যেখানে X
হয় n squared
মাইনাস এর সমষ্টি [1, ..., n-1]
হিসাবে বলেছেন, @Skidsdev নিচে মন্তব্যে।
উপরের দুটি বিকল্পের মধ্যে যদি (সমস্ত মানগুলি অনন্য নয়, বা একটি শূন্য উপস্থিত থাকে) তবে এটি একটি নতুন অ্যারে তৈরি করবে এবং পদক্ষেপ 1 এ পুনরায় সেট করে আবার সেট করুন This এটি আমাদের ফলাফল না হওয়া পর্যন্ত অব্যাহত থাকবে। এ কারণে সময়টি কিছুটা আলাদা হতে পারে। আমি এটি টিআইওতে একবার 3 সেকেন্ডের মধ্যে শেষ করতে দেখেছি n=50
, তবে একবারে 55 সেকেন্ডেও n=50
।
অভিন্নতার প্রমাণ:
কীভাবে এটি সম্পূর্ণ সৎ হতে প্রমাণ করা যায় তা সম্পর্কে আমি পুরোপুরি নিশ্চিত নই। java.util.Random#nextInt
যেমন ডক্স বর্ণনা করা হয়েছে, নিশ্চিত অভিন্ন হল:
পরবর্তী সিউডোরেন্ডমটি প্রদান করে, int
এই এলোমেলো নম্বর জেনারেটরের ক্রম থেকে সমানভাবে বিতরণকৃত মান। এর সাধারণ চুক্তিটি nextInt
হ'ল এক int
মান সিউডোর্যান্ডোমিলিকভাবে উত্পন্ন এবং ফিরে আসে। সমস্ত 2 32 সম্ভাব্য int
মানগুলি সমান সম্ভাব্যতার সাথে উত্পাদিত হয়।
এগুলি (সাজানো) এলোমেলো মানগুলির মধ্যে পার্থক্যগুলি অবশ্যই অভিন্ন নয়, তবে পুরো সেটগুলি অভিন্ন। আবার, এই গাণিতিকভাবে কীভাবে প্রমাণ করবেন তা আমি নিশ্চিত নই, তবে এখানে একটি স্ক্রিপ্ট রয়েছে যা একটি কাউন্টার সহ মানচিত্রে 10,000
উত্পন্ন সেটগুলি (জন্য n=10
) স্থাপন করবে , যেখানে বেশিরভাগ সেট অনন্য; কিছু দু'বার পুনরাবৃত্তি; এবং সর্বাধিক পুনরাবৃত্তি ঘটনাটি সাধারণত সীমার মধ্যে থাকে [4,8]
।
সংস্থাপনের নির্দেশনা:
জাভা যেহেতু জাভা কোড তৈরি এবং চালনা করতে পারে সে সম্পর্কে প্রচুর তথ্য সহ একটি সুপরিচিত ভাষা, সুতরাং আমি এটি সংক্ষেপে রাখব।
আমার কোডে ব্যবহৃত সমস্ত সরঞ্জাম জাভা 7 এ উপলব্ধ (সম্ভবত ইতিমধ্যে জাভা 5 বা 6 তেও রয়েছে, তবে আসুন মাত্র 7 ব্যবহার করুন)। আমি নিশ্চিত যে জাভা 7 যদিও ইতিমধ্যে সংরক্ষণাগারভুক্ত হয়েছে, তাই আমি আমার কোড চালানোর জন্য জাভা 8 ডাউনলোড করার পরামর্শ দেব।
উন্নতি সম্পর্কিত চিন্তাভাবনা:
আমি শূন্যগুলির জন্য চেকের জন্য একটি উন্নতি সন্ধান করতে চাই এবং সমস্ত মান অনন্য are আমি 0
আগে যাচাই করতে পারি, এটি নিশ্চিত করে যে আমরা অ্যারেতে যোগ করেছি এলোমেলো মান এটি ইতিমধ্যে নেই, তবে এর অর্থ কয়েকটি জিনিস থাকবে: অ্যারেটি এমন একটি হওয়া উচিত ArrayList
যাতে আমরা বিল্টিন পদ্ধতিটি ব্যবহার করতে পারি .contains
; আমরা তালিকায় নেই এমন একটি এলোমেলো মান খুঁজে পাওয়া পর্যন্ত অবধি লুপ যুক্ত করা উচিত। যেহেতু এখন শূন্যের জন্য পরীক্ষা করা .contains(0)
সেট (যা শুধুমাত্র একবার যাচাই করা হয়েছে) দিয়ে সম্পন্ন .contains
করা হয়েছে, সুতরাং তালিকার সাথে লুপ যোগ করার তুলনায় কর্মক্ষেত্রের পক্ষে সেই পর্যায়ে এটি পরীক্ষা করা আরও ভাল যা কমপক্ষে n
বার চেক করা হবে , তবে সম্ভবত আরও।
স্বতন্ত্রতা যাচাইয়ের জন্য, আমাদের কাছে কেবলমাত্র আমাদের n
এলোমেলো পূর্ণসংখ্যাগুলি রয়েছে যা n squared
প্রোগ্রামের প্রথম ধাপের 1 এর পরে যোগ হয় , তবে কেবলমাত্র তখনই আমরা পরীক্ষা করতে পারি যে সমস্ত অনন্য কিনা whether অ্যারের পরিবর্তে বাছাইযোগ্য তালিকা রাখা এবং এর মধ্যে পার্থক্যগুলি পরীক্ষা করা সম্ভব হতে পারে তবে আমি গুরুতরভাবে সন্দেহ করি যে এটি কেবলমাত্র একটিগুলিতে রাখার চেয়ে কর্মক্ষমতা উন্নত করবে Set
এবং সেই সেটের আকারটি n
একবার কিনা তা পরীক্ষা করে দেখুন ।