Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
zhhf96
C-Plus-Plus-TheAlgorithms
提交
e09637fb
C
C-Plus-Plus-TheAlgorithms
项目概览
zhhf96
/
C-Plus-Plus-TheAlgorithms
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
C-Plus-Plus-TheAlgorithms
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
e09637fb
编写于
7月 29, 2020
作者:
K
Krishna Vedala
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
named namespace
上级
d89b2df2
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
77 addition
and
24 deletion
+77
-24
hashing/quadratic_probing_hash_table.cpp
hashing/quadratic_probing_hash_table.cpp
+77
-24
未找到文件。
hashing/quadratic_probing_hash_table.cpp
浏览文件 @
e09637fb
...
...
@@ -10,8 +10,14 @@
#include <iostream>
#include <vector>
namespace
{
// keep the code local to this file by assigning them to an unnamed
/**
* @addtogroup Open Addressing
* @{
* @namespace quadratic_probing
* @brief An implementation of hash table using [quadratic
* probing](https://en.wikipedia.org/wiki/Quadratic_probing) algorithm.
*/
namespace
quadratic_probing
{
// fwd declarations
using
Entry
=
struct
Entry
;
bool
putProber
(
const
Entry
&
entry
,
int
key
);
...
...
@@ -26,19 +32,27 @@ int tomb = -1;
int
size
;
bool
rehashing
;
// Node that holds key
/** Node that holds key
*/
struct
Entry
{
explicit
Entry
(
int
key
=
notPresent
)
:
key
(
key
)
{}
int
key
;
explicit
Entry
(
int
key
=
notPresent
)
:
key
(
key
)
{}
///< constructor
int
key
;
///< key value
};
// Hash a key
/** Hash a key
* @param key key value to hash
* @returns hash of the key
*/
size_t
hashFxn
(
int
key
)
{
std
::
hash
<
int
>
hash
;
return
hash
(
key
);
}
// Performs quadratic probing to resolve collisions
/** Performs quadratic probing to resolve collisions
* @param key key value to search/probe
* @param searching `true` if only searching, `false1 if assigning
* @returns value of `notPresent`.
*/
int
quadraticProbe
(
int
key
,
bool
searching
)
{
int
hash
=
static_cast
<
int
>
(
hashFxn
(
key
));
int
i
=
0
;
...
...
@@ -83,7 +97,12 @@ int quadraticProbe(int key, bool searching) {
return
notPresent
;
}
// Finds empty spot
/** Finds empty spot
* @param entry Instance of table entry
* @param key key value to search/probe
* @returns `true` if key is present
* @returns `false` if key is absent
*/
bool
putProber
(
const
Entry
&
entry
,
int
key
)
{
if
(
entry
.
key
==
notPresent
||
entry
.
key
==
tomb
)
{
return
true
;
...
...
@@ -91,7 +110,12 @@ bool putProber(const Entry& entry, int key) {
return
false
;
}
// Looks for a matching key
/** Looks for a matching key
* @param entry Instance of table entry
* @param key key value to search/probe
* @returns `true` if key matches the entry
* @returns `false` if key does not match the entry
*/
bool
searchingProber
(
const
Entry
&
entry
,
int
key
)
{
if
(
entry
.
key
==
key
)
{
return
true
;
...
...
@@ -99,7 +123,11 @@ bool searchingProber(const Entry& entry, int key) {
return
false
;
}
// Helper
/** Get the entry instance corresponding to a key
* @param key key value to search/probe
* @returns if present, the entry instance
* @returns if not present, a new instance
*/
Entry
find
(
int
key
)
{
int
index
=
quadraticProbe
(
key
,
true
);
if
(
index
==
notPresent
)
{
...
...
@@ -108,7 +136,9 @@ Entry find(int key) {
return
table
[
index
];
}
// Displays the table
/** Displays the table
* @returns None
*/
void
display
()
{
for
(
int
i
=
0
;
i
<
totalSize
;
i
++
)
{
if
(
table
[
i
].
key
==
notPresent
)
{
...
...
@@ -124,7 +154,9 @@ void display() {
std
::
cout
<<
std
::
endl
;
}
// Rehashes the table into a bigger table
/** Rehashes the table into a bigger table
* @returns none
*/
void
rehash
()
{
// Necessary so wall of add info isn't printed all at once
rehashing
=
true
;
...
...
@@ -144,7 +176,9 @@ void rehash() {
std
::
cout
<<
"Table was rehashed, new size is: "
<<
totalSize
<<
std
::
endl
;
}
// Checks for load factor here
/** Checks for load factor here
* @param key key value to hash and add to table
*/
void
add
(
int
key
)
{
int
index
=
quadraticProbe
(
key
,
false
);
table
[
index
].
key
=
key
;
...
...
@@ -154,7 +188,9 @@ void add(int key) {
}
}
// Removes key. Leaves tombstone upon removal.
/** Removes key. Leaves tombstone upon removal.
* @param key key value to hash and remove from table
*/
void
remove
(
int
key
)
{
int
index
=
quadraticProbe
(
key
,
true
);
if
(
index
==
notPresent
)
{
...
...
@@ -165,7 +201,9 @@ void remove(int key) {
size
--
;
}
// Information about the adding process
/** Information about the adding process
* @param key key value to hash and add to table
*/
void
addInfo
(
int
key
)
{
std
::
cout
<<
"Initial table: "
;
display
();
...
...
@@ -178,7 +216,9 @@ void addInfo(int key) {
display
();
}
// Information about removal process
/** Information about removal process
* @param key key value to hash and remove from table
*/
void
removalInfo
(
int
key
)
{
std
::
cout
<<
"Initial table: "
;
display
();
...
...
@@ -190,9 +230,19 @@ void removalInfo(int key) {
std
::
cout
<<
"New table: "
;
display
();
}
}
// namespace
// I/O
}
// namespace quadratic_probing
/**
* @}
*/
using
quadratic_probing
::
Entry
;
using
quadratic_probing
::
table
;
using
quadratic_probing
::
totalSize
;
/** Main function
* @returns None
*/
int
main
()
{
int
cmd
=
0
,
hash
=
0
,
key
=
0
;
std
::
cout
<<
"Enter the initial size of Hash Table. = "
;
...
...
@@ -214,18 +264,20 @@ int main() {
case
1
:
std
::
cout
<<
"Enter key to add = "
;
std
::
cin
>>
key
;
addInfo
(
key
);
quadratic_probing
::
addInfo
(
key
);
break
;
case
2
:
std
::
cout
<<
"Enter key to remove = "
;
std
::
cin
>>
key
;
removalInfo
(
key
);
quadratic_probing
::
removalInfo
(
key
);
break
;
case
3
:
{
std
::
cout
<<
"Enter key to search = "
;
std
::
cin
>>
key
;
Entry
entry
=
table
[
quadraticProbe
(
key
,
true
)];
if
(
entry
.
key
==
notPresent
)
{
quadratic_probing
::
Entry
entry
=
quadratic_probing
::
table
[
quadratic_probing
::
quadraticProbe
(
key
,
true
)];
if
(
entry
.
key
==
quadratic_probing
::
notPresent
)
{
std
::
cout
<<
"Key not present"
;
}
break
;
...
...
@@ -233,10 +285,11 @@ int main() {
case
4
:
std
::
cout
<<
"Enter element to generate hash = "
;
std
::
cin
>>
key
;
std
::
cout
<<
"Hash of "
<<
key
<<
" is = "
<<
hashFxn
(
key
);
std
::
cout
<<
"Hash of "
<<
key
<<
" is = "
<<
quadratic_probing
::
hashFxn
(
key
);
break
;
case
5
:
display
();
quadratic_probing
::
display
();
break
;
default:
loop
=
false
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录