עוד חידת תכנות

עריסטו

Active member
נתון קובץ טקסט ובו 2000001 מלים. יש מלה אחת שמופיעה 1000001 פעמים בקובץ. עליכם למצוא את המלה הזו בדרך מהירה וחסכונית בזכרון.
 

הפרבולה1

Well-known member
שלב ראשון למיין את מערך המילים בסדר עולה או יורד ( סיבוכיות ריצה וזכרון ( n ) n*log ), ואז לקחת את האיבר האמצעי במערך הממוין.
 

SupermanZW

Well-known member
לטעון את המילים לטבלה בה שדה אחד הוא המילה (להשתמש בdistinct) והשדה הסמוך הוא מספר המופעים (פונקציית count), לבחור מהטבלה את המילה שמספר המופעים שלה 1000001.
 

ai27

Well-known member
פשוט אספור את כמות הפעמים שאות הופיעה בכל מיקום
וכך אקבל מטריצה עם 22 אותיות כפול m אורך המילה.
בכל מיקום, האות עם הכי הרבה מופעים היא המילה המנצחת

מעבר אחד או 2 על כל אות בקובץ
זיכרון: אורך המילה המקסימלית m*מספר האותיות החוקיות(שהוא קבוע)
 

עריסטו

Active member
פשוט אספור את כמות הפעמים שאות הופיעה בכל מיקום
וכך אקבל מטריצה עם 22 אותיות כפול m אורך המילה.
בכל מיקום, האות עם הכי הרבה מופעים היא המילה המנצחת

מעבר אחד או 2 על כל אות בקובץ
זיכרון: אורך המילה המקסימלית m*מספר האותיות החוקיות(שהוא קבוע)
יש פתרון פשוט ומהיר יותר.
 

ai27

Well-known member
יש פתרון פשוט ומהיר יותר.
מהיר יותר מלעבור פעם אחת על הקובץ...
מעניין
אז איך אתמודד עם המצב הגרוע של 2 מילים שאחת מופיעה מליון פעמים והשנייה מליון ואחד?
 
נערך לאחרונה ב:

עריסטו

Active member
מהיר יותר מלעבור פעם אחת על הקובץ...
מעניין
אז איך אתמודד עם המצב הגרוע של 2 מילים שאחת מופיעה מליון פעמים והשנייה מליון ואחד?
מה זה "מהיר יותר מלעבור פעם אחת על הקובץ"? יכולים להיות שני אלגוריתמים שעוברים פעם אחת על הקובץ, ואחד מהם יותר מהיר מהאחר.
 

ai27

Well-known member
מה זה "מהיר יותר מלעבור פעם אחת על הקובץ"? יכולים להיות שני אלגוריתמים שעוברים פעם אחת על הקובץ, ואחד מהם יותר מהיר מהאחר.
שניהם בדיוק אותה סיבוכיות.
אז אתה חורג מהתחום המתמטי של אלגוריתמים לאופטימיזציה.

באלגוריתם שהצעתי
על כל אות יש העלאת מונה בודד במערך.
אם היית אומר ש22*m זה הרבה מקום עוד מילא

אפשר לקצר קצת: לכל מיקום, אם יש מליון ואחת פעמים אות מסויימת, האות הזאת ידועה.
אבל זאת אופטימיזציה. לפעמים תקצר ולפעמים לא
 
נערך לאחרונה ב:
למעלה