مساله ۷۷. مرتب‌سازی کارت‌ها

یک میلیارد تا کارت داریم که روشون اعداد ۱ تا یک میلیارد هست و به یه ترتیب دلخواه روی هم قرار گرفتند و ما میتونیم عدد همه کارت ها را ببینیم.

هر بار میتونیم یک دلار پول بدیم و‌ عملیات زیر را انجام بدیم: کارت ها را به یه سری دسته تقسیم کنیم (هر دسته تعدادی کارت هستند که روی هم قرار دارند) و هر دسته را برعکس کنیم و دسته ها رو روی هم قرار بدیم. چقدر باید هزینه کنیم تا بتونیم کارت‌ها را مرتب کنیم؟

توضیحات:

  • هدف این است که در بدترین حالت هزینه را کمینه کنیم.
  • یک مثال از عملیات: مثلا ۵ تا کارت به ترتیب {4,3,5,1,2} داریم. میکنیمش ۳ تا دسته به این صورت {1,2} و {5} و {4,3}. بعد هر دسته را برعکس میکنیم میشه {2,1} و {5} و {3,4} و در نهایت روی هم قرار می‌دهیم و میشه {3,4,5,2,1}.

لینک سوال در توویتر: https://x.com/Riazi_Cafe/status/1814536700590498216

این یک سوال باز است و یافتن راه‌حل بهینه بسیار دشوار است. ما در زیر یک راه‌حل ارائه می‌دهیم که در بدترین حالت کارتها را با پرداختن ۹۰۰ دلار مرتب می‌کند.

برای ساده‌سازی راه‌حل، فرض می‌کنیم که به جای یک میلیارد کارت، تعداد کارت‌ها برابر با $2^{30}$ (که کمی بزرگ‌تر از یک میلیارد است) است. ما راه‌حل را با حل یک مسئله ساده‌تر که فقط با ۰ها و ۱ها سر و کار دارد، آغاز می‌کنیم.

لم. تعداد کارت‌ها $n$ را برابر با $2^k$ برای یک عدد صحیح $k > 0$ در نظر بگیرید. علاوه بر این، فرض کنید که عدد نیمی از کارت‌ها برابر با ۰ و عدد نیمه دیگر کارت ها برابر با ۱ هست. می‌توان با پرداختن $2k-1$ دلار کارت‌های با شماره ۰ را به بالای دسته و بقیه کارت‌ها را به پایین آورد.

اثبات. برای دستیابی به این هدف، ابتدا قصد داریم کارتها با مقادیر ۰ را در موقعیت‌های فرد و کارتها با مقدار ۱ را در موقعیت‌های زوج قرار دهیم. بنابراین، اعداد بر روی کارت‌ها به ترتیب $010101\ldots01$ خواهد بود. ما نشان می‌دهیم که این امر با صرف تنها $k$ دلار امکان‌پذیر است. با انجام اولین حرکتمان، تضمین می‌کنیم که تعداد ۰ها با تعداد ۱ ها در نیمه اول کارتها برابر باشد (این همچنین به این معنی است که تعداد ۰ها و ۱ ها در نیمه دوم هم برابر است). چنین حرکتی امکان‌پذیر است چرا که تعداد ۰ها و ۱ها در ابتدا برابرند و با برعکس کردن یک بازه اطراف کارت میانه می‌توانیم به این هدف برسیم. با تکرار یک حرکت مشابه، می‌توانیم تضمین کنیم که هر یک از ۴ بخش از کارت‌ها به طول $n/4$ دارای تعداد برابری ۰ و ۱ هستند. به طور کلی، با تکرار این عمل $k$ بار می‌توانیم تضمین کنیم که تمام ۰ها در مکان‌های فرد و ۱ها در مکان‌های زوج قرار دارند.

اکنون، از یک دنباله $01010101\ldots0101$ شروع می‌کنیم، می‌توانیم یک دلار خرج کنیم و آن را به دنباله $001100110011001100\ldots00110011$ تبدیل کنیم. به همین ترتیب، می‌توانیم یک دلار دیگر خرج کنیم و دنباله را به $0000111100001111\ldots00001111$ تبدیل کنیم. به طور کلی، با صرف $k-1$ دلار می‌توانیم تمام ۰ها را به بالا و بقیه را به پایین ببریم.

تعداد کارت‌ها را $n=2^{30}$ و $k = 30$ در نظر بگیرید. میتوان لم را اینگونه تصور کرد که کارتها را با $2k-1$ حرکت مرتب می‌کند، زمانی که نیمی از مقادیر برابر با ۰ و نیمه دیگر برابر با ۱ باشند. اکنون فرض کنید که اعداد منحصر به فرد هستند و بین $1$ و $n$ قرار دارند. می‌توانیم فرض کنیم که تمام اعداد از $1$ تا $n/2$ برابر با صفر و بقیه برابر با یک هستند. با استفاده از لم می‌توانیم تمام کارت‌های با مقدار بین $1$ و $n/2$ را به بالا و بقیه را به پایین بفرستیم. این برای ما $2k-1$ دلار هزینه دارد. از اینجا به بعد، باید کارت‌ها را در دو نیمه مرتب کنیم. با استفاده از یک تکنیک مشابه، می‌توانیم $2(k-1)-1$ دلار خرج کنیم و مطمئن شویم که هر یک از ۴ بخش از کارت‌های اندازه $n/4$ دارای کارت‌های مربوطه خود هستند (اما لزوماً در ترتیب مشخصی نیست). بنابراین، اگر این کار را $k$ بار ادامه دهیم می‌توانیم تمام کارت‌ها را مرتب کنیم. هزینه کل که در این حالت می‌پردازیم برابر با $$(2k-1) + (2(k-1)+1) + (2(k-2)-1) + \ldots + (2(1)-1) = k(k+1) - k = k^2.$$ که در این حالت برابر با ۹۰۰ است.