赞
踩
bayes概率
P
r
(
X
=
x
)
为明文的先验概率
P
r
(
Y
=
y
)
为密文的先验概率
P
r
(
K
=
k
)
为密钥的先验概率
C
(
K
)
=
(
e
k
(
x
)
∣
k
∈
P
)
,
P
为明文,
C
(
K
)
为密文
∀
y
∈
C
,
P
r
(
Y
=
y
)
=
Σ
k
:
y
∈
C
(
K
)
P
r
(
K
=
k
)
P
r
(
x
=
d
k
(
y
)
)
P
r
(
Y
=
y
∣
X
=
x
)
=
Σ
k
:
x
=
d
k
(
y
)
P
r
(
K
=
k
)
所有先验概率准备完毕,下面是
b
a
y
e
s
概率了
P
r
(
X
=
x
∣
Y
=
y
)
=
P
r
(
X
=
x
)
×
Σ
k
:
x
=
d
k
(
y
)
P
r
(
K
=
k
)
Σ
k
:
y
∈
C
(
k
)
P
r
(
K
=
k
)
P
r
(
x
=
d
x
(
y
)
)
Pr(X=x)为明文的先验概率 \\Pr(Y=y)为密文的先验概率 \\Pr(K=k)为密钥的先验概率 \\C(K)=(e_k(x)|k \in P),P为明文,C(K)为密文 \\\forall y \in C,Pr(Y=y)=\Sigma_{k:y \in C(K)} Pr(K=k)Pr(x=d_k(y)) \\Pr(Y=y|X=x)=\Sigma_{k:x=d_k(y)}Pr(K=k) \\所有先验概率准备完毕,下面是bayes概率了 \\Pr(X=x|Y=y)=\frac {Pr(X=x)\times \Sigma_{k:x=d_k(y)}Pr(K=k)}{\Sigma_{k:y \in C(k)}Pr(K=k)Pr(x=d_x(y))}
Pr(X=x)为明文的先验概率Pr(Y=y)为密文的先验概率Pr(K=k)为密钥的先验概率C(K)=(ek(x)∣k∈P),P为明文,C(K)为密文∀y∈C,Pr(Y=y)=Σk:y∈C(K)Pr(K=k)Pr(x=dk(y))Pr(Y=y∣X=x)=Σk:x=dk(y)Pr(K=k)所有先验概率准备完毕,下面是bayes概率了Pr(X=x∣Y=y)=Σk:y∈C(k)Pr(K=k)Pr(x=dx(y))Pr(X=x)×Σk:x=dk(y)Pr(K=k)
例子
设明文集合
P
=
{
1
,
2
,
3
,
4
,
5
}
,密文集合
C
=
{
a
,
b
,
c
,
d
,
e
}
∀
i
∈
P
,
P
r
(
i
)
=
1
2
i
,
P
r
(
1
)
=
1
2
,
P
r
(
2
)
=
1
4
,
P
r
(
3
)
=
1
6
,
.
.
.
K
=
{
K
1
,
K
2
}
,
P
r
(
K
i
)
=
1
−
1
2
i
,
P
r
(
K
1
)
=
1
2
,
P
r
(
K
2
)
=
3
4
0
≤
j
<
5
,
j
∈
Z
e
K
i
(
P
j
)
=
C
(
j
+
i
+
1
)
m
o
d
5
e
K
1
(
1
)
=
c
,
e
K
1
(
2
)
=
d
,
e
K
1
(
3
)
=
e
,
e
K
1
(
4
)
=
a
,
e
K
1
(
5
)
=
b
e
K
2
(
1
)
=
d
,
e
K
2
(
2
)
=
e
,
e
K
2
(
3
)
=
a
,
e
K
2
(
4
)
=
b
,
e
K
2
(
5
)
=
c
1.
C
概率分布
P
r
(
a
)
=
(
1
/
2
)
×
(
1
/
8
)
+
(
3
/
4
)
×
(
1
/
6
)
=
3
/
16
P
r
(
b
)
=
(
1
/
2
)
×
(
1
/
10
)
+
(
3
/
4
)
×
(
1
/
8
)
P
r
(
c
)
=
(
1
/
2
)
×
(
1
/
2
)
+
(
3
/
4
)
×
(
1
/
10
)
P
r
(
d
)
=
(
1
/
2
)
×
(
1
/
4
)
+
(
3
/
4
)
×
(
1
/
2
)
P
r
(
e
)
=
(
1
/
2
)
×
(
1
/
4
)
+
(
3
/
4
)
×
(
1
/
6
)
2.
给定密文后,明文空间上条件概率分布为
P
r
(
X
=
x
∣
Y
=
y
)
P
r
(
1
∣
a
)
=
0
P
r
(
2
∣
a
)
=
0
.
.
.
.
P
r
(
4
∣
a
)
=
P
r
(
X
=
4
)
×
P
r
(
K
=
K
1
)
P
r
(
Y
=
a
)
=
1
/
8
×
1
/
2
3
/
16
=
1
3
.
.
.
.
3.
密码机制具有完善保密性
<
=
对于任意
x
∈
P
,
y
∈
C
,
P
r
(
x
∣
y
)
=
P
r
(
x
)
上面例子的密码机制不具有完善保密性
:
P
r
(
4
∣
a
)
=
1
/
3
,
P
(
4
)
=
1
/
8
设明文集合P=\{1,2,3,4,5\},密文集合C=\{a,b,c,d,e\} \\ \forall i \in P,Pr(i)=\frac 1 {2i},Pr(1)=\frac 1 2,Pr(2)= \frac 1 4,Pr(3)=\frac 1 6,... \\K=\{K_1,K_2\},Pr(K_i)=1-\frac 1 {2i},Pr(K_1)=\frac 1 2,Pr(K_2) =\frac 3 4 \\0 \le j < 5,j \in Z \\e_{K_i}(P_j)=C_{(j+i+1) mod5} \\e_{K_1}(1)=c,e_{K_1}(2)=d,e_{K_1}(3)=e,e_{K_1}(4)=a,e_{K_1}(5)=b \\e_{K_2}(1)=d,e_{K_2}(2)=e,e_{K_2}(3)=a,e_{K_2}(4)=b,e_{K_2}(5)=c \\1.C概率分布 \\Pr(a)=(1/2) \times (1/8)+(3/4)\times(1/6)=3/16 \\Pr(b)=(1/2)\times(1/10)+(3/4)\times(1/8) \\Pr(c)=(1/2)\times(1/2)+(3/4)\times(1/10) \\Pr(d)=(1/2)\times(1/4)+(3/4)\times(1/2) \\Pr(e)=(1/2)\times(1/4)+(3/4)\times(1/6) \\2.给定密文后,明文空间上条件概率分布为Pr(X=x|Y=y) \\Pr(1|a)=0 \\Pr(2|a)=0 \\.... \\Pr(4|a)=\frac {Pr(X=4)\times Pr(K=K_1)} {Pr(Y=a)}=\frac {1/8 \times1/2}{3/16}=\frac 1 3 \\.... \\3.密码机制具有完善保密性<=对于任意x \in P,y \in C,Pr(x|y)=Pr(x) \\上面例子的密码机制不具有完善保密性:Pr(4|a)=1/3,P(4)=1/8
设明文集合P={1,2,3,4,5},密文集合C={a,b,c,d,e}∀i∈P,Pr(i)=2i1,Pr(1)=21,Pr(2)=41,Pr(3)=61,...K={K1,K2},Pr(Ki)=1−2i1,Pr(K1)=21,Pr(K2)=430≤j<5,j∈ZeKi(Pj)=C(j+i+1)mod5eK1(1)=c,eK1(2)=d,eK1(3)=e,eK1(4)=a,eK1(5)=beK2(1)=d,eK2(2)=e,eK2(3)=a,eK2(4)=b,eK2(5)=c1.C概率分布Pr(a)=(1/2)×(1/8)+(3/4)×(1/6)=3/16Pr(b)=(1/2)×(1/10)+(3/4)×(1/8)Pr(c)=(1/2)×(1/2)+(3/4)×(1/10)Pr(d)=(1/2)×(1/4)+(3/4)×(1/2)Pr(e)=(1/2)×(1/4)+(3/4)×(1/6)2.给定密文后,明文空间上条件概率分布为Pr(X=x∣Y=y)Pr(1∣a)=0Pr(2∣a)=0....Pr(4∣a)=Pr(Y=a)Pr(X=4)×Pr(K=K1)=3/161/8×1/2=31....3.密码机制具有完善保密性<=对于任意x∈P,y∈C,Pr(x∣y)=Pr(x)上面例子的密码机制不具有完善保密性:Pr(4∣a)=1/3,P(4)=1/8
mutable struct NodeData
data::String
data_pr::Real
bm::Union{String,Nothing}
end
mutable struct TreeNode
data::NodeData
left::Union{TreeNode, Nothing}
right::Union{TreeNode, Nothing}
end
# 插入节点的函数
function newnode(data::String,data_pr::Real,bm=nothing)
ndata=NodeData(data,data_pr,bm)
tnode=TreeNode(ndata,nothing,nothing)
return tnode
end
function insertleft(node::TreeNode, leftsubnode::TreeNode)
node.left=leftsubnode
end
function insertright(node::TreeNode, rightsubnode::TreeNode)
node.right=rightsubnode
end
function printPaths(node::TreeNode, nodetype::String="L",path = [])
if node == nothing
return
end
if nodetype=="L"
node.data.bm="0"
else
node.data.bm="1"
end
# 将当前节点的值添加到路径中
push!(path, node.data)
# 如果是叶节点,则打印路径
if node.left == nothing && node.right == nothing
println("===",path,"===")
else
# 递归遍历左子树和右子树
printPaths(node.left,"L",path)
printPaths(node.right,"R",path)
end
# 回溯,移除当前节点值
pop!(path)
end
# 使用
strtxt="
Fedora Workstation is Fedora’s official desktop edition. It provides a powerful, easy to use desktop experience. Workstation is intended to be a great general purpose desktop. It also aims to be a fantastic platform for software developers.
Workstation is part of the Fedora project. As such, it shares components, tools, and processes with other Fedora Editions and Spins. However, Workstation is also an independent project, which is able to make its own design and technical decisions, and is a distinct product of its own.
The Workstation Working Group is the team that has responsibility for Fedora Workstation. However, Workstation wouldn’t be possible without the hard work of teams and individuals across the entire Fedora community.
"
#计算概率
word_pr=Dict{String,Real}()
for i in eachindex(strtxt)
global word_pr
if haskey(word_pr,string(strtxt[i]))
word_pr[string(strtxt[i])]+=1
else
word_pr[string(strtxt[i])]=1
end
end
allwordcount=sum(values(word_pr))
map!(x->x/allwordcount, values(word_pr))
nodelist=Dict{String,TreeNode}()
#构建优先队列
wordslist=collect(word_pr)
sort!(wordslist,by=x->x[2])
while length(wordslist)>1
global nodelist
global wordslist
#从优先队列中取出两个频率最小的节点,创建一个新的父节点,其频率为这两个子节点频率之和。
c1=popfirst!(wordslist)
c2=popfirst!(wordslist)
if !haskey(nodelist,c1[1])
nodelist[c1[1]]=newnode(c1[1],c1[2])
end
if !haskey(nodelist,c2[1])
nodelist[c2[1]]=newnode(c2[1],c2[2])
end
#将新节点作为这两个子节点的父节点,并将新节点插入回优先队列。
if !haskey(nodelist,c1[1]*c2[1])
parentnode=newnode(c1[1]*c2[1],c1[2]+c2[2])
nodelist[c1[1]*c2[1]]=parentnode
insertleft(parentnode,nodelist[c1[1]])
insertright(parentnode,nodelist[c2[1]])
end
push!(wordslist,c1[1]*c2[1]=>c1[2]+c2[2])
sort!(wordslist,by=x->x[2])
end
printPaths(nodelist[wordslist[1][1]])
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("oh,mg’jHITxAE.unrvGSyfpa", 0.4008042895442359, "0"), NodeData("oh,mg’jHITxAE.u", 0.17828418230563003, "0"), NodeData("o", 0.08847184986595175, "0")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("oh,mg’jHITxAE.unrvGSyfpa", 0.4008042895442359, "0"), NodeData("oh,mg’jHITxAE.u", 0.17828418230563003, "0"), NodeData("h,mg’jHITxAE.u", 0.08981233243967829, "1"), NodeData("h,m", 0.04289544235924933, "0"), NodeData("h", 0.021447721179624665, "0")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("oh,mg’jHITxAE.unrvGSyfpa", 0.4008042895442359, "0"), NodeData("oh,mg’jHITxAE.u", 0.17828418230563003, "0"), NodeData("h,mg’jHITxAE.u", 0.08981233243967829, "1"), NodeData("h,m", 0.04289544235924933, "0"), NodeData(",m", 0.021447721179624665, "1"), NodeData(",", 0.010723860589812333, "0")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("oh,mg’jHITxAE.unrvGSyfpa", 0.4008042895442359, "0"), NodeData("oh,mg’jHITxAE.u", 0.17828418230563003, "0"), NodeData("h,mg’jHITxAE.u", 0.08981233243967829, "1"), NodeData("h,m", 0.04289544235924933, "0"), NodeData(",m", 0.021447721179624665, "1"), NodeData("m", 0.010723860589812333, "1")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("oh,mg’jHITxAE.unrvGSyfpa", 0.4008042895442359, "0"), NodeData("oh,mg’jHITxAE.u", 0.17828418230563003, "0"), NodeData("h,mg’jHITxAE.u", 0.08981233243967829, "1"), NodeData("g’jHITxAE.u", 0.04691689008042896, "1"), NodeData("g’jHITxAE", 0.021447721179624665, "0"), NodeData("g’j", 0.010723860589812333, "0"), NodeData("g", 0.005361930294906166, "0")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("oh,mg’jHITxAE.unrvGSyfpa", 0.4008042895442359, "0"), NodeData("oh,mg’jHITxAE.u", 0.17828418230563003, "0"), NodeData("h,mg’jHITxAE.u", 0.08981233243967829, "1"), NodeData("g’jHITxAE.u", 0.04691689008042896, "1"), NodeData("g’jHITxAE", 0.021447721179624665, "0"), NodeData("g’j", 0.010723860589812333, "0"), NodeData("’j", 0.005361930294906166, "1"), NodeData("’", 0.002680965147453083, "0")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("oh,mg’jHITxAE.unrvGSyfpa", 0.4008042895442359, "0"), NodeData("oh,mg’jHITxAE.u", 0.17828418230563003, "0"), NodeData("h,mg’jHITxAE.u", 0.08981233243967829, "1"), NodeData("g’jHITxAE.u", 0.04691689008042896, "1"), NodeData("g’jHITxAE", 0.021447721179624665, "0"), NodeData("g’j", 0.010723860589812333, "0"), NodeData("’j", 0.005361930294906166, "1"), NodeData("j", 0.002680965147453083, "1")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("oh,mg’jHITxAE.unrvGSyfpa", 0.4008042895442359, "0"), NodeData("oh,mg’jHITxAE.u", 0.17828418230563003, "0"), NodeData("h,mg’jHITxAE.u", 0.08981233243967829, "1"), NodeData("g’jHITxAE.u", 0.04691689008042896, "1"), NodeData("g’jHITxAE", 0.021447721179624665, "0"), NodeData("HITxAE", 0.010723860589812333, "1"), NodeData("HI", 0.005361930294906166, "0"), NodeData("H", 0.002680965147453083, "0")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("oh,mg’jHITxAE.unrvGSyfpa", 0.4008042895442359, "0"), NodeData("oh,mg’jHITxAE.u", 0.17828418230563003, "0"), NodeData("h,mg’jHITxAE.u", 0.08981233243967829, "1"), NodeData("g’jHITxAE.u", 0.04691689008042896, "1"), NodeData("g’jHITxAE", 0.021447721179624665, "0"), NodeData("HITxAE", 0.010723860589812333, "1"), NodeData("HI", 0.005361930294906166, "0"), NodeData("I", 0.002680965147453083, "1")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("oh,mg’jHITxAE.unrvGSyfpa", 0.4008042895442359, "0"), NodeData("oh,mg’jHITxAE.u", 0.17828418230563003, "0"), NodeData("h,mg’jHITxAE.u", 0.08981233243967829, "1"), NodeData("g’jHITxAE.u", 0.04691689008042896, "1"), NodeData("g’jHITxAE", 0.021447721179624665, "0"), NodeData("HITxAE", 0.010723860589812333, "1"), NodeData("TxAE", 0.005361930294906166, "1"), NodeData("Tx", 0.002680965147453083, "0"), NodeData("T", 0.0013404825737265416, "0")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("oh,mg’jHITxAE.unrvGSyfpa", 0.4008042895442359, "0"), NodeData("oh,mg’jHITxAE.u", 0.17828418230563003, "0"), NodeData("h,mg’jHITxAE.u", 0.08981233243967829, "1"), NodeData("g’jHITxAE.u", 0.04691689008042896, "1"), NodeData("g’jHITxAE", 0.021447721179624665, "0"), NodeData("HITxAE", 0.010723860589812333, "1"), NodeData("TxAE", 0.005361930294906166, "1"), NodeData("Tx", 0.002680965147453083, "0"), NodeData("x", 0.0013404825737265416, "1")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("oh,mg’jHITxAE.unrvGSyfpa", 0.4008042895442359, "0"), NodeData("oh,mg’jHITxAE.u", 0.17828418230563003, "0"), NodeData("h,mg’jHITxAE.u", 0.08981233243967829, "1"), NodeData("g’jHITxAE.u", 0.04691689008042896, "1"), NodeData("g’jHITxAE", 0.021447721179624665, "0"), NodeData("HITxAE", 0.010723860589812333, "1"), NodeData("TxAE", 0.005361930294906166, "1"), NodeData("AE", 0.002680965147453083, "1"), NodeData("A", 0.0013404825737265416, "0")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("oh,mg’jHITxAE.unrvGSyfpa", 0.4008042895442359, "0"), NodeData("oh,mg’jHITxAE.u", 0.17828418230563003, "0"), NodeData("h,mg’jHITxAE.u", 0.08981233243967829, "1"), NodeData("g’jHITxAE.u", 0.04691689008042896, "1"), NodeData("g’jHITxAE", 0.021447721179624665, "0"), NodeData("HITxAE", 0.010723860589812333, "1"), NodeData("TxAE", 0.005361930294906166, "1"), NodeData("AE", 0.002680965147453083, "1"), NodeData("E", 0.0013404825737265416, "1")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("oh,mg’jHITxAE.unrvGSyfpa", 0.4008042895442359, "0"), NodeData("oh,mg’jHITxAE.u", 0.17828418230563003, "0"), NodeData("h,mg’jHITxAE.u", 0.08981233243967829, "1"), NodeData("g’jHITxAE.u", 0.04691689008042896, "1"), NodeData(".u", 0.02546916890080429, "1"), NodeData(".", 0.012064343163538873, "0")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("oh,mg’jHITxAE.unrvGSyfpa", 0.4008042895442359, "0"), NodeData("oh,mg’jHITxAE.u", 0.17828418230563003, "0"), NodeData("h,mg’jHITxAE.u", 0.08981233243967829, "1"), NodeData("g’jHITxAE.u", 0.04691689008042896, "1"), NodeData(".u", 0.02546916890080429, "1"), NodeData("u", 0.013404825737265416, "1")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("oh,mg’jHITxAE.unrvGSyfpa", 0.4008042895442359, "0"), NodeData("nrvGSyfpa", 0.22252010723860588, "1"), NodeData("nr", 0.10455764075067024, "0"), NodeData("n", 0.05093833780160858, "0")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("oh,mg’jHITxAE.unrvGSyfpa", 0.4008042895442359, "0"), NodeData("nrvGSyfpa", 0.22252010723860588, "1"), NodeData("nr", 0.10455764075067024, "0"), NodeData("r", 0.05361930294906166, "1")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("oh,mg’jHITxAE.unrvGSyfpa", 0.4008042895442359, "0"), NodeData("nrvGSyfpa", 0.22252010723860588, "1"), NodeData("vGSyfpa", 0.11796246648793565, "1"), NodeData("vGSyfp", 0.05630026809651474, "0"), NodeData("vGSyf", 0.02815013404825737, "0"), NodeData("vGSy", 0.013404825737265416, "0"), NodeData("v", 0.006702412868632708, "0")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("oh,mg’jHITxAE.unrvGSyfpa", 0.4008042895442359, "0"), NodeData("nrvGSyfpa", 0.22252010723860588, "1"), NodeData("vGSyfpa", 0.11796246648793565, "1"), NodeData("vGSyfp", 0.05630026809651474, "0"), NodeData("vGSyf", 0.02815013404825737, "0"), NodeData("vGSy", 0.013404825737265416, "0"), NodeData("GSy", 0.006702412868632708, "1"), NodeData("GS", 0.002680965147453083, "0"), NodeData("G", 0.0013404825737265416, "0")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("oh,mg’jHITxAE.unrvGSyfpa", 0.4008042895442359, "0"), NodeData("nrvGSyfpa", 0.22252010723860588, "1"), NodeData("vGSyfpa", 0.11796246648793565, "1"), NodeData("vGSyfp", 0.05630026809651474, "0"), NodeData("vGSyf", 0.02815013404825737, "0"), NodeData("vGSy", 0.013404825737265416, "0"), NodeData("GSy", 0.006702412868632708, "1"), NodeData("GS", 0.002680965147453083, "0"), NodeData("S", 0.0013404825737265416, "1")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("oh,mg’jHITxAE.unrvGSyfpa", 0.4008042895442359, "0"), NodeData("nrvGSyfpa", 0.22252010723860588, "1"), NodeData("vGSyfpa", 0.11796246648793565, "1"), NodeData("vGSyfp", 0.05630026809651474, "0"), NodeData("vGSyf", 0.02815013404825737, "0"), NodeData("vGSy", 0.013404825737265416, "0"), NodeData("GSy", 0.006702412868632708, "1"), NodeData("y", 0.004021447721179625, "1")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("oh,mg’jHITxAE.unrvGSyfpa", 0.4008042895442359, "0"), NodeData("nrvGSyfpa", 0.22252010723860588, "1"), NodeData("vGSyfpa", 0.11796246648793565, "1"), NodeData("vGSyfp", 0.05630026809651474, "0"), NodeData("vGSyf", 0.02815013404825737, "0"), NodeData("f", 0.014745308310991957, "1")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("oh,mg’jHITxAE.unrvGSyfpa", 0.4008042895442359, "0"), NodeData("nrvGSyfpa", 0.22252010723860588, "1"), NodeData("vGSyfpa", 0.11796246648793565, "1"), NodeData("vGSyfp", 0.05630026809651474, "0"), NodeData("p", 0.028150134048257374, "1")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("oh,mg’jHITxAE.unrvGSyfpa", 0.4008042895442359, "0"), NodeData("nrvGSyfpa", 0.22252010723860588, "1"), NodeData("vGSyfpa", 0.11796246648793565, "1"), NodeData("a", 0.06166219839142091, "1")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("iwbFkl sted\nWc", 0.599195710455764, "1"), NodeData("iwbFkl ", 0.28284182305630023, "0"), NodeData("iwbFkl", 0.1327077747989276, "0"), NodeData("i", 0.06568364611260054, "0")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("iwbFkl sted\nWc", 0.599195710455764, "1"), NodeData("iwbFkl ", 0.28284182305630023, "0"), NodeData("iwbFkl", 0.1327077747989276, "0"), NodeData("wbFkl", 0.06702412868632707, "1"), NodeData("wbF", 0.030831099195710455, "0"), NodeData("w", 0.014745308310991957, "0")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("iwbFkl sted\nWc", 0.599195710455764, "1"), NodeData("iwbFkl ", 0.28284182305630023, "0"), NodeData("iwbFkl", 0.1327077747989276, "0"), NodeData("wbFkl", 0.06702412868632707, "1"), NodeData("wbF", 0.030831099195710455, "0"), NodeData("bF", 0.0160857908847185, "1"), NodeData("b", 0.00804289544235925, "0")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("iwbFkl sted\nWc", 0.599195710455764, "1"), NodeData("iwbFkl ", 0.28284182305630023, "0"), NodeData("iwbFkl", 0.1327077747989276, "0"), NodeData("wbFkl", 0.06702412868632707, "1"), NodeData("wbF", 0.030831099195710455, "0"), NodeData("bF", 0.0160857908847185, "1"), NodeData("F", 0.00804289544235925, "1")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("iwbFkl sted\nWc", 0.599195710455764, "1"), NodeData("iwbFkl ", 0.28284182305630023, "0"), NodeData("iwbFkl", 0.1327077747989276, "0"), NodeData("wbFkl", 0.06702412868632707, "1"), NodeData("kl", 0.03619302949061662, "1"), NodeData("k", 0.01742627345844504, "0")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("iwbFkl sted\nWc", 0.599195710455764, "1"), NodeData("iwbFkl ", 0.28284182305630023, "0"), NodeData("iwbFkl", 0.1327077747989276, "0"), NodeData("wbFkl", 0.06702412868632707, "1"), NodeData("kl", 0.03619302949061662, "1"), NodeData("l", 0.01876675603217158, "1")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("iwbFkl sted\nWc", 0.599195710455764, "1"), NodeData("iwbFkl ", 0.28284182305630023, "0"), NodeData(" ", 0.15013404825737264, "1")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("iwbFkl sted\nWc", 0.599195710455764, "1"), NodeData("sted\nWc", 0.3163538873994638, "1"), NodeData("st", 0.15281501340482573, "0"), NodeData("s", 0.07238605898123325, "0")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("iwbFkl sted\nWc", 0.599195710455764, "1"), NodeData("sted\nWc", 0.3163538873994638, "1"), NodeData("st", 0.15281501340482573, "0"), NodeData("t", 0.08042895442359249, "1")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("iwbFkl sted\nWc", 0.599195710455764, "1"), NodeData("sted\nWc", 0.3163538873994638, "1"), NodeData("ed\nWc", 0.16353887399463807, "1"), NodeData("e", 0.08176943699731903, "0")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("iwbFkl sted\nWc", 0.599195710455764, "1"), NodeData("sted\nWc", 0.3163538873994638, "1"), NodeData("ed\nWc", 0.16353887399463807, "1"), NodeData("d\nWc", 0.08176943699731903, "1"), NodeData("d", 0.040214477211796246, "0")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("iwbFkl sted\nWc", 0.599195710455764, "1"), NodeData("sted\nWc", 0.3163538873994638, "1"), NodeData("ed\nWc", 0.16353887399463807, "1"), NodeData("d\nWc", 0.08176943699731903, "1"), NodeData("\nWc", 0.04155495978552279, "1"), NodeData("\nW", 0.020107238605898123, "0"), NodeData("\n", 0.00938337801608579, "0")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("iwbFkl sted\nWc", 0.599195710455764, "1"), NodeData("sted\nWc", 0.3163538873994638, "1"), NodeData("ed\nWc", 0.16353887399463807, "1"), NodeData("d\nWc", 0.08176943699731903, "1"), NodeData("\nWc", 0.04155495978552279, "1"), NodeData("\nW", 0.020107238605898123, "0"), NodeData("W", 0.010723860589812333, "1")]===
===Any[NodeData("oh,mg’jHITxAE.unrvGSyfpaiwbFkl sted\nWc", 1.0, "0"), NodeData("iwbFkl sted\nWc", 0.599195710455764, "1"), NodeData("sted\nWc", 0.3163538873994638, "1"), NodeData("ed\nWc", 0.163538873994638
上述程序构造了从根结点到叶子结点的所有路径。
以下内容取自文心一言自动生成。
其中,X 表示随机变量,n 是 X可能取值的总数, P ( x i ) P(x_i) P(xi)是 X取值为 x i x_i xi的概率, log 2 \log_2 log2 表示以2为底的对数。
这个公式表示了随机变量 X 的信息熵 H(X),它是 X 所有可能取值的信息量的加权平均,权重是各个取值的概率。信息量 I ( x i ) I(x_i) I(xi)被定义为 − log 2 ( P ( x i ) ) -\log_2(P(x_i)) −log2(P(xi)),它表示了当随机变量 X取值为 x i x_i xi时,我们所获得的信息量。
在信息论中,熵(Entropy)是一个用来量化信息不确定性或随机性的重要概念。信息学熵的计算主要基于概率分布,其计算公式和信息量的概念紧密相关。
以下是对信息学熵的详细阐述:
[ H ( X ) = − ∑ i = 1 n P ( x i ) log b P ( x i ) ] [ H(X) = -\sum_{i=1}^{n} P(x_i) \log_b P(x_i) ] [H(X)=−∑i=1nP(xi)logbP(xi)]
其中, P ( x i ) P(x_i) P(xi)是随机变量X取值为 x i x_i xi的概率,n是X所有可能取值的数量,b是对数的底数(在信息论中,常用2作为底数,此时单位称为比特;也有用自然对数作为底数的,此时单位称为奈特)。
信息量与信息熵紧密相关,它度量的是一个具体事件发生了所带来的信息。对于某一事件X,其信息量I(X)的计算公式为:
[ I ( X ) = − log b P ( X ) ] [ I(X) = -\log_b P(X) ] [I(X)=−logbP(X)]
其中,P(X)是事件X发生的概率。这个公式表明,一个事件发生的概率越小,它所包含的信息量就越大;反之,概率越大,信息量就越小。
确定随机变量的所有可能取值及其概率:首先,需要明确随机变量X的所有可能取值,并计算出每个取值对应的概率 P ( x i ) P(x_i) P(xi)。
计算每个取值的信息量:根据信息量的计算公式,计算随机变量X每个取值的信息量 I ( x i ) = − log b P ( x i ) I(x_i) = -\log_b P(x_i) I(xi)=−logbP(xi)。
计算信息熵:最后,将每个取值的信息量乘以其对应的概率,并求和,即可得到随机变量X的信息熵 H ( X ) = − ∑ i = 1 n P ( x i ) log b P ( x i ) H(X) = -\sum_{i=1}^{n} P(x_i) \log_b P(x_i) H(X)=−∑i=1nP(xi)logbP(xi)。
非负性:信息熵总是非负的,即 H ( X ) ≥ 0 H(X) \geq 0 H(X)≥0。这是因为概率P的取值范围是[0,1],而对数函数在(0,1]区间内是负的,所以加上负号后变为正数或0。
极值性:当随机变量X的所有取值概率相等时(即均匀分布),信息熵取得最大值。这是因为此时不确定性最大。
可加性:对于多个相互独立的随机变量,它们联合分布的信息熵等于各随机变量信息熵之和。
[ H ( X ) = − ∑ i = 1 32 1 32 log 2 1 32 = − log 2 1 32 = 5 比特 ] [H(X) = -\sum_{i=1}^{32} \frac{1}{32} \log_2 \frac{1}{32} = -\log_2 \frac{1}{32} = 5 \text{比特} ] [H(X)=−∑i=132321log2321=−log2321=5比特]
这表示,为了确定世界杯冠军,平均需要5比特的信息量。然而,在实际情况下,由于各支球队的夺冠概率并不相等,因此所需的信息量通常会小于5比特。
[ H ( X ) = − ( 0.5 log 2 ( 0.5 ) + 0.5 log 2 ( 0.5 ) ) = − ( 0.5 × ( − 1 ) + 0.5 × ( − 1 ) ) = 1 bit ] [ H(X) = - (0.5 \log_2(0.5) + 0.5 \log_2(0.5)) = - (0.5 \times (-1) + 0.5 \times (-1)) = 1 \text{ bit} ] [H(X)=−(0.5log2(0.5)+0.5log2(0.5))=−(0.5×(−1)+0.5×(−1))=1 bit]
这表示在平均意义上,我们需要1比特的信息来完全确定 (X) 的取值。
又称霍夫曼编码,是一种可变字长编码(VLC, Variable Length Coding)方式,由David A. Huffman在1952年提出。它是一种用于无损数据压缩的熵编码算法,通常用于压缩重复率比较高的字符数据。哈夫曼编码完全依据字符出现概率来构造异字头的平均长度最短的码字,因此有时也称之为最佳编码。
哈夫曼编码的基本方法是先对图像数据或文本数据扫描一遍,计算出各种字符或像素出现的概率,然后按概率的大小指定不同长度的唯一码字,由此得到一张该数据的哈夫曼码表。编码后的数据记录的是每个字符或像素的码字,而码字与实际字符或像素值的对应关系则记录在码表中。
哈夫曼编码已被广泛应用于数据压缩领域,如文件压缩、图像压缩、视频压缩等。此外,在通信和网络传输中,哈夫曼编码也常被用于减少数据传输量,提高传输效率。
综上所述,哈夫曼编码是一种基于字符或像素出现频率的无损数据压缩算法,通过构建哈夫曼树并为每个字符或像素生成唯一的编码来实现数据的压缩。由于其高效的压缩性能和广泛的应用场景,哈夫曼编码在数据压缩领域具有重要的地位。
哈夫曼编码(Huffman Coding),又称霍夫曼编码,是由David A. Huffman在1952年提出的一种编码方法,它完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码。哈夫曼编码是可变字长编码(VLC)的一种,其基本原理是表示符号的码字长度随符号的出现概率而变化,对出现概率大的符号赋予短码字,出现概率小的符号赋予长码字,并且码字长度严格按照所对应符号出现概率大小逆序排列。以下是哈夫曼编码的具体过程:
假设有以下符号及其概率:a(0.4), b(0.2), c(0.2), d(0.1), e(0.1)。
这样,就得到了每个符号的哈夫曼码字,并可以据此对包含这些符号的数据进行编码。
哈夫曼编码由于其编码长度与符号出现概率的逆序关系,使得编码后的数据平均长度最短,因此在实际应用中常用于数据压缩领域。
哈夫曼编码是一种广泛用于数据文件压缩的非常有效的编码方法,其核心思想是利用字符频率信息,通过贪心策略构建一棵最优二叉树(哈夫曼树),使得高频字符使用较短的编码,低频字符使用较长的编码,从而实现数据压缩。以下是哈夫曼编码的具体算法步骤:
统计频率:
构建优先队列:
构建哈夫曼树:
生成编码:
假设有一个字符串“aaaaabbcdddeee”,我们可以按照以下步骤进行哈夫曼编码:
统计频率:
构建优先队列和哈夫曼树(这里省略详细构建过程,仅给出结果):
生成编码:
哈夫曼编码的算法实现相对简单,主要涉及到频率统计、优先队列操作以及树的构建。在实际应用中,可以使用各种编程语言中的数据结构(如优先队列、二叉树等)来实现该算法。
1.《密码学原理与实践(第三版)》
2. 文心一言
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。