Кіріспе

Хештеу үшін компьютерлік бағдарламалау әдісі. Сызықтық зондтау – компьютерлік бағдарламалауда хеш-кестелердегі соқтығыстарды шешудің бір жолы. Хеш-кестелер – кілт-мәнді жұптар жиынтығын сақтау және белгілі бір кілтке сәйкес келетін мәнді табу үшін қолданылатын дерек құрылымдары. Оны 1954 жылы Джин Амдал, Элейн М. Макгроу және Артур Сэмюэл ойлап тапты, ал 1963 жылы Дональд Кнут алғаш рет талдады. Сызықтық зондтау, квадраттық зондтау және қос хештеу сияқты, ашық адрестеудің бір түрі болып табылады. Бұл схемаларда хеш-кестедегі әрбір ұяшықта бір ғана кілт-мәнді жұп сақталады. Егер хеш-функциясы жаңа кілтті басқа кілтпен толып тұрған хеш-кестесінің ұяшығына сәйкестендірсе, соқтығысу туындайды. Мұндай жағдайда сызықтық зондтау кестедегі ең жақын бос орынды іздеп, жаңа кілтті сол жерге орналастырады. Іздеу де осылай жүзеге асырылады: хеш-функциясы көрсеткен орыннан бастап кесте тізбектеп ізделіп, сәйкес кілті бар немесе бос ұяшық табылғанша іздеу жалғастырылады. Авторлардың айтуынша, "Хеш-кестелер – ең көп қолданылатын күрделі емес дерек құрылымдары, ал стандартты жабдықтардағы ең танымал іске асыру сызықтық зондтауды қолданады, ол жылдам әрі қарапайым".

Іздеу

Берілген x кілтін іздеу үшін T ұяшықтары тексеріледі, h(x) индексіндегі ұяшықтан бастап (мұнда h – хэш функциясы), және бос ұяшық немесе сақталған кілті x болатын ұяшық табылғанша h(x) + 1, h(x) + 2, ... көрші ұяшықтармен жалғасады. Егер кілті бар ұяшық табылса, іздеу сол ұяшықтағы мәнді қайтарады. Әйтпесе, егер бос ұяшық табылса, кілт кестеде жоқ, себебі ол әлі ізделмеген кез келген кейінгі ұяшыққа қарағанда осы ұяшыққа орналастырылар еді. Бұл жағдайда іздеу кілт сөздікте жоқ екенін көрсетеді.

Жою

Сонымен қатар, сөздіктегі кілт-мәнді жұпты жою да мүмкін. Дегенмен, оның ұяшығын ғана бос қалдыру жеткіліксіз. Бұл, бос ұяшықтан бұрын хэш-мәні бар, бірақ бос ұяшықтан кейін сақталған басқа кілттерді іздеуге әсер етеді. Бос ұяшық осы іздеулердің кілттің жоқ екенін қате хабарлауына себеп болады. Оның орнына, i ұяшығы бос болғанда, басқа бос ұяшықты немесе i ұяшығына жылжытуға болатын кілтті (яғни, хэш-мәні i-ге тең немесе одан ертерек болатын кілтті) тапқанға дейін кестедегі келесі ұяшықтарды қарап шығу қажет. Егер бос ұяшық табылса, i ұяшығын босату қауіпсіз және жою процесі аяқталады. Бірақ, егер i ұяшығына жылжытуға болатын кілт табылса, ол жылжытылады. Бұл жылжытылған кілтті іздеуді жылдамдатады, бірақ сонымен қатар сол блоктағы басқа ұяшықты бос қалдырады. Жаңа бос ұяшық үшін жылжытуға болатын кілтті іздеу, бұрыннан бос ұяшыққа жеткенше сол тәсілмен жалғасады. Осы кілттерді ертерек ұяшықтарға жылжыту процесінде әрбір кілт бір рет қана қарастырылады. Сондықтан, бүкіл процесті аяқтауға кеткен уақыт жойылған кілтті қамтитын салынған ұяшықтар блогының ұзындығына пропорционалды, бұл басқа хэш-кесте операцияларының орындалу уақытына сәйкес келеді.

Бастапқы кластерлеу

Сызықтық зондтаулы хэш-кестелер бастапқы кластерлеу деп аталатын мәселеге ұшырайды, онда элементтер ұзын, біріккен тізбектерге жиналады.

Тарих

Конрад Цузе мен Ванневар Буштың жұмысында 1940 жылдардың ортасына дейін деректерге оның мекенжайы бойынша емес, мәні бойынша қол жеткізуге мүмкіндік беретін ассоциативтік массив идеясы туған, бірақ хэш-кестелер 1953 жылға дейін Ханс Питер Лунның IBM меморандумында сипатталған жоқ. Лун сызықтық зондтаудың орнына тізбектеу әдісін, басқаша соқтығысуды шешу тәсілін қолданды. Сызықтық зондтаудың алғашқы тарихын қысқаша баяндайды. Бұл алғашқы ашық адрестеу әдісі болды және бастапқыда ашық адрестеумен бірдей мағынада қолданылды. Кнуттың сөзіне сәйкес, оны алғаш рет Джин Амдал, Элейн М. Макгроу (туған есімі Боем) және Артур Сэмюэл 1954 жылы IBM 701 компьютері үшін құрастыру бағдарламасында қолданған. Бұл әдіс 1958 жылы совет ғалымы Андрей Ершов тарапынан жарияланған. Кездейсоқ хэш-функцияларды қолданғанда әр операцияға тұрақты уақыт жұмсалатынын көрсететін сызықтық зондтаудың алғашқы теориялық талдауын Кнут жасады. Сондай-ақ, сызықтық зондтаудың бұрынғы талдаулардағы идеалды кездейсоқ функциялармен емес, іс жүзінде қолдануға болатын хэш-функциялармен операция бойынша тұрақты уақытта жұмыс істейтінін дәлелдеді.