Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Snowleopard_wu
Java
提交
6111fb76
J
Java
项目概览
Snowleopard_wu
/
Java
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
Java
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
6111fb76
编写于
4月 29, 2020
作者:
A
Anirudh
提交者:
GitHub
4月 29, 2020
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #1289 from iheb1196/Development
Integer Queue
上级
a3c111b5
c6c6fffa
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
239 addition
and
0 deletion
+239
-0
src/main/java/com/dataStructures/IntQueue.java
src/main/java/com/dataStructures/IntQueue.java
+111
-0
src/test/java/com/dataStructures/IntQueueTest.java
src/test/java/com/dataStructures/IntQueueTest.java
+128
-0
未找到文件。
src/main/java/com/dataStructures/IntQueue.java
0 → 100644
浏览文件 @
6111fb76
package
com.dataStructures
;
/**
* This file contains an implementation of an integer only queue which is extremely quick and
* lightweight. In terms of performance it can outperform java.util.ArrayDeque (Java's fastest queue
* implementation) by a factor of 40+! See the benchmark test below for proof. However, the downside
* is you need to know an upper bound on the number of elements that will be inside the queue at any
* given time for this queue to work.
*
*
*/
public
class
IntQueue
{
private
int
[]
ar
;
private
int
front
,
end
,
sz
;
// maxSize is the maximum number of items
// that can be in the queue at any given time
public
IntQueue
(
int
maxSize
)
{
front
=
end
=
0
;
sz
=
maxSize
+
1
;
ar
=
new
int
[
sz
];
}
// Return true/false on whether the queue is empty
public
boolean
isEmpty
()
{
return
front
==
end
;
}
// Return the number of elements inside the queue
public
int
size
()
{
if
(
front
>
end
)
return
(
end
+
sz
-
front
);
return
end
-
front
;
}
public
int
peek
()
{
return
ar
[
front
];
}
// Add an element to the queue
public
void
enqueue
(
int
value
)
{
ar
[
end
]
=
value
;
if
(++
end
==
sz
)
end
=
0
;
if
(
end
==
front
)
throw
new
RuntimeException
(
"Queue too small!"
);
}
// Make sure you check is the queue is not empty before calling dequeue!
public
int
dequeue
()
{
int
ret_val
=
ar
[
front
];
if
(++
front
==
sz
)
front
=
0
;
return
ret_val
;
}
// Example usage to check the how fast this implementation is
public
static
void
main
(
String
[]
args
)
{
IntQueue
q
=
new
IntQueue
(
5
);
q
.
enqueue
(
1
);
q
.
enqueue
(
2
);
q
.
enqueue
(
3
);
q
.
enqueue
(
4
);
q
.
enqueue
(
5
);
System
.
out
.
println
(
q
.
dequeue
());
// 1
System
.
out
.
println
(
q
.
dequeue
());
// 2
System
.
out
.
println
(
q
.
dequeue
());
// 3
System
.
out
.
println
(
q
.
dequeue
());
// 4
System
.
out
.
println
(
q
.
isEmpty
());
// false
q
.
enqueue
(
1
);
q
.
enqueue
(
2
);
q
.
enqueue
(
3
);
System
.
out
.
println
(
q
.
dequeue
());
// 5
System
.
out
.
println
(
q
.
dequeue
());
// 1
System
.
out
.
println
(
q
.
dequeue
());
// 2
System
.
out
.
println
(
q
.
dequeue
());
// 3
System
.
out
.
println
(
q
.
isEmpty
());
// true
benchMarkTest
();
}
// BenchMark IntQueue vs ArrayDeque.
private
static
void
benchMarkTest
()
{
int
n
=
10000000
;
IntQueue
intQ
=
new
IntQueue
(
n
);
// IntQueue times at around 0.0324 seconds
long
start
=
System
.
nanoTime
();
for
(
int
i
=
0
;
i
<
n
;
i
++)
intQ
.
enqueue
(
i
);
for
(
int
i
=
0
;
i
<
n
;
i
++)
intQ
.
dequeue
();
long
end
=
System
.
nanoTime
();
System
.
out
.
println
(
"IntQueue Time: "
+
(
end
-
start
)
/
1
e9
);
// ArrayDeque times at around 1.438 seconds
java
.
util
.
ArrayDeque
<
Integer
>
arrayDeque
=
new
java
.
util
.
ArrayDeque
<>();
// java.util.ArrayDeque <Integer> arrayDeque = new java.util.ArrayDeque<>(n); // strangely the
// ArrayQueue is slower when you give it an initial capacity.
start
=
System
.
nanoTime
();
for
(
int
i
=
0
;
i
<
n
;
i
++)
arrayDeque
.
offer
(
i
);
for
(
int
i
=
0
;
i
<
n
;
i
++)
arrayDeque
.
poll
();
end
=
System
.
nanoTime
();
System
.
out
.
println
(
"ArrayDeque Time: "
+
(
end
-
start
)
/
1
e9
);
}
}
\ No newline at end of file
src/test/java/com/dataStructures/IntQueueTest.java
0 → 100644
浏览文件 @
6111fb76
package
com.dataStructures
;
import
static
org
.
junit
.
Assert
.*;
import
java.util.*
;
import
org.junit.Before
;
import
org.junit.Test
;
public
class
IntQueueTest
{
@Before
public
void
setup
()
{}
@Test
public
void
testEmptyQueue
()
{
IntQueue
queue
=
new
IntQueue
(
0
);
assertTrue
(
queue
.
isEmpty
());
assertEquals
(
queue
.
size
(),
0
);
}
@Test
public
void
testEnqueueOneElement
()
{
IntQueue
queue
=
new
IntQueue
(
1
);
queue
.
enqueue
(
77
);
assertEquals
(
queue
.
size
(),
1
);
}
@Test
public
void
testAll
()
{
int
n
=
5
;
IntQueue
queue
=
new
IntQueue
(
10
);
assertTrue
(
queue
.
isEmpty
());
for
(
int
i
=
1
;
i
<=
n
;
i
++)
{
queue
.
enqueue
(
i
);
assertFalse
(
queue
.
isEmpty
());
}
for
(
int
i
=
1
;
i
<=
n
;
i
++)
{
assertEquals
(
i
,
queue
.
peek
());
assertEquals
(
i
,
queue
.
dequeue
());
assertEquals
(
queue
.
size
(),
n
-
i
);
}
assertTrue
(
queue
.
isEmpty
());
n
=
8
;
for
(
int
i
=
1
;
i
<=
n
;
i
++)
{
queue
.
enqueue
(
i
);
assertFalse
(
queue
.
isEmpty
());
}
for
(
int
i
=
1
;
i
<=
n
;
i
++)
{
assertEquals
(
i
,
queue
.
peek
());
assertEquals
(
i
,
queue
.
dequeue
());
assertEquals
(
queue
.
size
(),
n
-
i
);
}
assertTrue
(
queue
.
isEmpty
());
n
=
9
;
for
(
int
i
=
1
;
i
<=
n
;
i
++)
{
queue
.
enqueue
(
i
);
assertFalse
(
queue
.
isEmpty
());
}
for
(
int
i
=
1
;
i
<=
n
;
i
++)
{
assertEquals
(
i
,
queue
.
peek
());
assertEquals
(
i
,
queue
.
dequeue
());
assertEquals
(
queue
.
size
(),
n
-
i
);
}
assertTrue
(
queue
.
isEmpty
());
n
=
10
;
for
(
int
i
=
1
;
i
<=
n
;
i
++)
{
queue
.
enqueue
(
i
);
assertFalse
(
queue
.
isEmpty
());
}
for
(
int
i
=
1
;
i
<=
n
;
i
++)
{
assertEquals
(
i
,
queue
.
peek
());
assertEquals
(
i
,
queue
.
dequeue
());
assertEquals
(
queue
.
size
(),
n
-
i
);
}
assertTrue
(
queue
.
isEmpty
());
}
@Test
public
void
testPeekOneElement
()
{
IntQueue
queue
=
new
IntQueue
(
1
);
queue
.
enqueue
(
77
);
assertTrue
(
queue
.
peek
()
==
77
);
assertEquals
(
queue
.
size
(),
1
);
}
@Test
public
void
testDequeueOneElement
()
{
IntQueue
queue
=
new
IntQueue
(
1
);
queue
.
enqueue
(
77
);
assertTrue
(
queue
.
dequeue
()
==
77
);
assertEquals
(
queue
.
size
(),
0
);
}
@Test
public
void
testRandom
()
{
for
(
int
qSize
=
1
;
qSize
<=
50
;
qSize
++)
{
IntQueue
intQ
=
new
IntQueue
(
qSize
);
ArrayDeque
<
Integer
>
javaQ
=
new
ArrayDeque
<>(
qSize
);
assertEquals
(
javaQ
.
isEmpty
(),
intQ
.
isEmpty
());
assertEquals
(
javaQ
.
size
(),
intQ
.
size
());
for
(
int
operations
=
0
;
operations
<
5000
;
operations
++)
{
double
r
=
Math
.
random
();
if
(
r
<
0.60
)
{
int
elem
=
(
int
)
(
1000
*
Math
.
random
());
if
(
javaQ
.
size
()
<
qSize
)
{
javaQ
.
offer
(
elem
);
intQ
.
enqueue
(
elem
);
}
}
else
{
if
(!
javaQ
.
isEmpty
())
{
assertEquals
((
int
)
javaQ
.
poll
(),
(
int
)
intQ
.
dequeue
());
}
}
assertEquals
(
javaQ
.
isEmpty
(),
intQ
.
isEmpty
());
assertEquals
(
javaQ
.
size
(),
intQ
.
size
());
}
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录