PDA

View Full Version : کمک فوری : بازسازی فایل ترتیبی



Tarrah
شنبه 21 آذر 1383, 12:57 عصر
سلام
یه فایل داریم از نوع ترتیبی.این فایل رو دو قسمت در نظر می گیریم.یه قسمتش مثلا 25000 تا رکوردش مرتب (sorted) هست ویه قسمت overflow داره که رکوردهایی رو که بعدا به فایل اضافه می کنیم در این قسمت قرار می گیرند.حال می خواهیم وقتی تعداد رکوردهای این قسمت به 5000 تا رسید فایل رو سازماندهی مجدد کنیم.
در ضمن sort کل فایل باید در داخل همان فایل باشد و نمی توانیم از فایل کمکی استفاده کنیم.
چه روشی رو برای این الگوریتم یا کد برنامه پیشنهاد می کنید؟ اگه link خاصی می دونین لطفا ادرسشو برام بنویسین.ممنون :oops:

MiRHaDi
شنبه 28 آذر 1383, 19:29 عصر
سلام
از فایل دیگری باید استفاده کنی به صورت Temp و بعد از انجام اینکار باید به نام فایل اصلی آنرا تغییر دهی
و از روش Merg استفاده کن !
یک اشاره گر در فایل اول یکی در فایل دوم ! آنقدر در فایل اول جلو میری و در فایل سوم کپی میکنی تا رکورد فایل دوم کوچکتر شود و بعد رکورد فایل 2 را کپی میکنی و اشاره گرش را به جلو میبری ....
در آخر فایل 1 را پاک میکنی و فایل 3 را به 1 تغییر نام میدهی همین
بای

MM_Mofidi
سه شنبه 01 دی 1383, 12:21 عصر
به جای فایل دوم میتونی از آخر همون فایل هم استفاده کنی.فقط یکم سخت تره

رضا جاسبی
یک شنبه 25 بهمن 1383, 14:14 عصر
خیر ! روش Merge وقتی جواب می ده که هر دو تا عنصر ( آرایه یا فایل یا هر چیز دیگه ) مرتب باشند. در اینجا قسمت دوم فایل مرتب نیست. اول باید برای اون قسمت یک فکری بکنیم و بعد بازسازی رو با روش Merge انجام بدیم.
پیشنهاد من اینه که یکبار کل فایل رو پیمایش کنیم و مقادیر کد ترتیب ( که فایل ترتیبی بر اساس اون شکل می گیره ) و شماره رکوردها ( اندیس رکورد در فایل ) رو در بیاریم و با یک روش Sort که فکر می کنم بهترین روش در این حالت Insertion Sort است در یک Linked List ( و یا یک آرایه در صورت استفاده از روشهای دیگر Sort ) مرتب سازی را انجام دهیم. و سپس بر اساس این لیست مرتب شده از فایل اصلی رکوردها را با SEEK بخوانیم و در جای خودشان ثبت کنیم.
ثبت در فایل موقت منطقی تره اما اگر محدودیت استفاده از فقط یک فایل داریم می توانی از همان فایل استفاده کنی و حتی نه از آخر فایل. ( نکته در مورد آخر فایل این است که سایز فایل بزرگ غیر واقعی می شود و چطور می شود به مقدار اصلی برش گرداند؟ هر ابزار برنامه نویسی این امکان را نمی دهد.)
به عنوان مثال فرض کن که رکورد 1 باید از رکوردهای جدید باشد. یعنی باید رکورد اول جابجا شود. در این حالت باید جای رکورد اول و مثلا 25010 را با هم عوض کنی. توجه داشته باشید که در لیست مرتب شده هم باید اندیس رکورد 1 سابق ( که الان به مکان 25010 منتقل شده ) اصلاح شود.