দুটি অ্যারে দেওয়া; $births
কারও জন্মের সময়কে চিহ্নিত করে জন্ম বয়সের $deaths
একটি তালিকা রয়েছে এবং কারও মৃত্যুর সময় মৃত্যুর বয়সের একটি তালিকা রয়েছে, যেখানে জনসংখ্যার সর্বাধিক ছিল সেই বছরটি আমরা কীভাবে খুঁজে পেতে পারি?
উদাহরণস্বরূপ নিম্নলিখিত অ্যারে দেওয়া:
$births = [1984, 1981, 1984, 1991, 1996];
$deaths = [1991, 1984];
যে বছর জনসংখ্যার সর্বাধিক ছিল সেই বছরটি হওয়া উচিত 1996
, কারণ 3
সেই বছর লোকেরা বেঁচে ছিল, যা এই সমস্ত বছরের মধ্যে জনসংখ্যার সর্বোচ্চ গণনা ছিল।
এখানে চলমান গণিতটি এখানে:
| জন্ম | মৃত্যু | জনসংখ্যা | | ------- | ------- | ------------ | | 1981 | | 1 | | 1984 | | | 2 | | 1984 | | 1984 | | 2 | | 1991 | 1991 | 2 | | 1996 | | | 3 |
অনুমিতি
আমরা নিরাপদে ধরে নিতে পারি যে, যে বছর যে কেউ জন্মগ্রহণ করে সে বছর জনসংখ্যা এক বাড়তে পারে এবং যে বছর কেউ মারা যায় সেই বছর জনসংখ্যা হ্রাস পেতে পারে। সুতরাং এই উদাহরণে, 2 জন 1984 সালে জন্মগ্রহণ করেছিলেন এবং 1 জন 1984 সালে মারা গিয়েছিলেন, যার অর্থ জনসংখ্যা সে বছর 1 টি বৃদ্ধি পেয়েছিল।
আমরা নিরাপদে ধরেও নিতে পারি যে মৃত্যুর সংখ্যা কখনই জন্মের সংখ্যার চেয়ে বেশি হবে না এবং জনসংখ্যার সংখ্যা 0 হলে মৃত্যুও ঘটতে পারে না।
আমরা নিরাপদে অনুমান করতে পারেন উভয় বছর $deaths
এবং $births
নেতিবাচক বা ফ্লোটিং পয়েন্ট মান হতে হবে না ( তারা সবসময় 0 থেকে বেশি ধনাত্মক পূর্ণসংখ্যা করছি )।
আমরা ধরে নিতে পারি না যে অ্যারেগুলি সাজানো হবে বা অবশ্য সদৃশ মান হবে না।
আবশ্যকতা
ইনপুট হিসাবে এই দুটি অ্যারে প্রদত্ত, যে বছর সবচেয়ে বেশি জনসংখ্যা ঘটেছিল, তার ফিরতে আমাদের অবশ্যই একটি ফাংশন লিখতে হবে। ফাংশন ফেরত দিতে পারেন 0
, false
, ""
, অথবা NULL
( কোনো falsey মান গ্রহণযোগ্য ) যদি ইনপুট অ্যারে খালি রয়েছে অথবা যদি জনগণের মধ্যে 0 এ সবসময় ছিল। একাধিক বছরে সর্বাধিক জনসংখ্যা দেখা দিলে এই ফাংশনটি প্রথম বছরে ফিরে আসতে পারে যেখানে সর্বোচ্চ জনসংখ্যা পৌঁছেছিল বা পরবর্তী কোনও বছর year
উদাহরণ স্বরূপ:
$births = [1997, 1997, 1997, 1998, 1999];
$deaths = [1998, 1999];
/* The highest population was 3 on 1997, 1998 and 1999, either answer is correct */
অতিরিক্ত হিসাবে, সমাধানের বিগ ও সহ সহায়ক হবে।
এটি করার ক্ষেত্রে আমার সর্বোত্তম চেষ্টাটি হবে:
function highestPopulationYear(Array $births, Array $deaths): Int {
sort($births);
sort($deaths);
$nextBirthYear = reset($births);
$nextDeathYear = reset($deaths);
$years = [];
if ($nextBirthYear) {
$years[] = $nextBirthYear;
}
if ($nextDeathYear) {
$years[] = $nextDeathYear;
}
if ($years) {
$currentYear = max(0, ...$years);
} else {
$currentYear = 0;
}
$maxYear = $maxPopulation = $currentPopulation = 0;
while(current($births) !== false || current($deaths) !== false || $years) {
while($currentYear === $nextBirthYear) {
$currentPopulation++;
$nextBirthYear = next($births);
}
while($currentYear === $nextDeathYear) {
$currentPopulation--;
$nextDeathYear = next($deaths);
}
if ($currentPopulation >= $maxPopulation) {
$maxPopulation = $currentPopulation;
$maxYear = $currentYear;
}
$years = [];
if ($nextBirthYear) {
$years[] = $nextBirthYear;
}
if ($nextDeathYear) {
$years[] = $nextDeathYear;
}
if ($years) {
$currentYear = min($years);
} else {
$currentYear = 0;
}
}
return $maxYear;
}
উপরের অ্যালগরিদমটি বহুত্ববৈজ্ঞানিক সময়ে কাজ করা উচিত O(((n log n) * 2) + k)
যেখানে দেওয়া হয় এটি সবচেয়ে খারাপ যেখানে n
প্রতিটি অ্যারে থেকে বাছাই করা উপাদানগুলির k
সংখ্যা এবং জন্মের বছর ( যেহেতু আমরা জানি যে k
সর্বদা এটিই রয়েছেk >= y
) যেখানে y
মৃত্যুর বছর রয়েছে। তবে, আরও কার্যকর সমাধান আছে কিনা তা সম্পর্কে আমি নিশ্চিত নই।
আমার আগ্রহগুলি সম্পূর্ণরূপে বিদ্যমান অ্যালগরিদমের উপর গণ্য জটিলতার উন্নত বিগ ও are স্মৃতি জটিলতা কোন উদ্বেগের নয়। না রানটাইম অপ্টিমাইজেশন। কমপক্ষে এটি প্রাথমিক উদ্বেগ নয় । যে কোনও ছোট / বড় রানটাইম অপ্টিমাইজেশান স্বাগত, তবে এখানে মূল ফ্যাক্টর নয়।