АЛГОРИТМ ЛИНЕЙНОГО КОЭФФИЦИЕНТА

Merhabalar, Bugün sizlerle файла Организация dersinde anlatılan algoritmadan bahsetmek istiyorum.Aşağıya sırasıyla lq.h Ile lq.cpp dosyalarının içeriklerini ekledim.Algoritmanın mantığını бир örnekle anlatmak istiyorum.Elimizde boyutu 11 Olan бир вектор olsun.Bu вектор için kullanılan хэш fonksiyonu ISE girilecek değerinin данных vectorün boyuyla ilişkili olduğunu varsayyyoruz.Yani 11 boyutluk vectore 17 'yi eklemek istediğimizde 6.adrese(index 6) 17 degerini atar.Lisch algoritmasından farklı olarak increment değeri vardır.Bu değeri bulabilmek için .

Адрес = 17 мод 11 (ключ % data_vec.size())

Приращение=17/11 (ключ/data_vec.size())

Увеличение sayesinde bulduğumuz адрес datasının dolu olma ihtimaline karşılık elimizdeki yeni datayı ханги адрес koymalıyız cevabını verir.

6. адрес örneğimiz için dolu olsun.Peki şimdi 17yi nereye koyabiliriz? 6. adresten increment değeri kadar ileri gidelim ve bakalım o address değeri boş mu?(data_vec[index].valid)Eğer boşsa yerleştirelim,değilse increment değeri kadar ilerleyelim.Bu döngü (data_vec[index].valid==false) olana kadar devam eder.(по умолчанию değeri olarak valid'e false atamıştım kodda)

Peki probs sayısı ne?Probs,aradığımız key değerine kaç adımda gittiğimizi söyler.Yani yukarıda bahsetmiş olduğum (data_vec[index].valid==false) değerine ulaşıp döngüden kaç adımda çıktııı.

Lisch algoritmasını da haftaya bugün bu saatlerde paylaşıyor olacağım.Sevgiyle kalın :)

#include ‹вектор›

используя std::vector;

класс LQ{

public: // Обычно было бы закрытым. Объявлен общедоступным для целей тестирования.

класс lq_entry{

публичный:

логическое значение;

внутренние данные;

lq_entry () {

действительный = ложный;

}

};

вектор‹lq_entry› data_vec;

публичный:

LQ (целое число);

пустая вставка (целое число);

int find_num_probes(int) const;

двойная константа find_average_num_probes();

int dos_include (ключ int);

};

#include «lq.h»

#include ‹iostream›

#include ‹вектор›

#include ‹строка›

использование пространства имен std;

LQ::LQ(int table_size){

data_vec.resize (table_size, lq_entry());

}

недействительным LQ::insert(int new_data){

int adress=new_data % data_vec.size();// (таблица 11) (данные 34 (адрес 1) (включая 3)

int inc=new_data/data_vec.size();

int src_adr=адрес;//inc_adr=1

интервал n_index=0;

if(data_vec[адрес].valid==false){

data_vec[адрес].data=new_data;

data_vec[адрес].valid=true;

}

еще{

int новый_индекс = адрес;

в то время как (data_vec[new_index].valid!=false){

new_index=(new_index+inc)%data_vec.size();

}

data_vec[новый_индекс].данные=новые_данные;

data_vec[новый_индекс].valid=true;

}

}

int LQ::find_num_probes(int key) const{

int адрес=ключ % data_vec.size();// (таблица 11) (данные 34 (адрес 1) (включая 3)

int inc=key/data_vec.size();

int src_adr=адрес;//inc_adr=1

целое количество = 1;

интервал n_index=0;

int новый_индекс = адрес;

while(data_vec[new_index].data!=key){// (8.adreste n_index) (inc 6 )(datasize 10 ) (arta kalan 4 n_index başlangıcı artı sıfır)

new_index=(new_index+inc)%data_vec.size();

количество++;

}

если (data_vec [новый_индекс]. данные == ключ)

количество возвратов;

}

двойной LQ::find_average_num_probes() const{

целочисленный счетчик=0;

внутренний индекс=0;

интервал small_counter=0;

двойная сумма=0,0;

двойное среднее=0;

в то время как (индекс! = data_vec.size ()) {

если(data_vec[index].valid==true){

small_counter=find_num_probes(data_vec[index].data);

счетчик++;

сумма+=маленький_счетчик;

}

индекс++;

}

среднее=сумма/счетчик;

средний доход;

}

int LQ:: does_include (целый ключ) {

for(int i=0;i‹data_vec.size();i++){

если (data_vec[i].data==key)

вернуть 1;

}

вернуть 0;

}