یک نوار حافظه با تعداد بسیار زیادی خانه داریم که در ۱۰۰۰ خانه اول آن، ۱۰۰۰ عدد ذخیره شدهاند و در بقیه خانههای آن عدد صفر نوشته شده است. تعداد زیادی پردازنده هم وجود دارند. در هر نوبت هر پردازنده میتواند دوتا از خانههای این حافظه را بخواند و بر اساس این دو عدد، عدد دلخواهی را در یکی از خانههای این نوار حافظه بنویسید(همه این کارها در یک نوبت انجام میشود). توجه کنید که در هر نوبت همه پردازندهها میتوانند با هم عمل کنند. اگر چند پردازنده در یک نوبت بخواهند روی یک خانه حافظه به طور مشترک عددی را بنویسند. یکی از این اعداد به طور تصادفی نوشته میشود. میخواهیم پردازندهها طوری عمل کنند که پس از حداقل تعداد نوبتها بزرگترین عدد از بین ۱۰۰۰ عدد در خانه اول حافظه نوشته شود.
پاسخ
برای حل قسمت اول کافی است توجه کنید که lg(1000)<10. بنابراین در نوبت اول اعداد را به ۵۰۰ زوج تقسیم کرده (خانه ۱ و ۲، خانه ۳ و ۴ و به همین ترتیب) و هر پردازنده با مقایسه دو عدد یک زوج عدد بزرگتر را در خانه کوچکتر (مثلا از بین زوج ۳ و ۴ عدد بزرگتر در خانه ۳ نوشته میشود) مینویسد. حال در نوبت دوم همین ۵۰۰ خانه را به ۲۵۰ زوج تقسیم میکنیم و …
اما این کار را تنها با ۲ حرکت هم میتوان انجام داد: در نوبت اول به ازای هر دو خانه (1≤i,j≤1000)i,j، یک پردازنده در نظر میگیریم و برنامه کاری این پردازنده را به این صورت مشخص میکنیم که اگر i بزرگتر بود، در خانه 1000+j عدد ۱ بنویسید و اگر jبزرگتر بود در خانه 1000+i عدد ۱ را بنویسید. با کمی دقت خواهید فهمید که پس از نوبت اول، اگر در یک خانه i از بین خانههای ۱۰۰۱ تا ۲۰۰۰ عدد صفر وجود داشته باشد، خانه i−1000 حاوی عدد ماکزیمم بوده است. پس خیلی راحت در نوبت دوم ۱۰۰۰ پردازنده در نظر میگیریم که هر یک، یکی از خانههای (1001≤i≤2000)i را به همراه خانهی i−1000 چک کند و در صورتی که عدد موجود در خانهی i صفر بود، عدد موجود در خانه i−1000 را در خانه ۱ بنویسید.