alphaFeedback

WorksComputer Science

Binary Huffman Coding with Unequal Letter Costs Is NP-Complete

AI contributions
Not recorded for this paper
View details

Abstract

Binary prefix coding assigns prefix-free binary words to symbols to minimize their frequency-weighted cost. Huffman solved the equal-letter-cost case in polynomial time in 1952 [Proc. IRE'52]. For unequal letter costs, Karp gave an integer-programming formulation in 1961 [IRE Trans. Inf. Theory'61]. Exact polynomial-time algorithms for fixed integer costs were given by Golin and Rote [IEEE Trans. Inf. Theory'98] and Bradford, Golin, Larmore, and Rytter [J. Algorithms'02]. For input-dependent costs, Golin, Mathieu, and Young gave a polynomial-time approximation scheme [SICOMP'12]. The exact complexity when letter costs are part of the input had remained unresolved. We resolve this 6565-year-old problem by proving that deciding whether there exists a binary prefix-free code of frequency-weighted cost at most a given threshold is NP-complete, even when the letter costs are consecutive positive integers (M,M+1)(M,M+1) supplied as part of the input. All frequencies, letter costs, and thresholds are encoded in binary. Consequently, finding an optimal code is NP-hard. Our proof uses two polynomial-time reductions, starting from Planar Independent Set. The intermediate problem prescribes the number of leaves at each depth of a full ordered binary tree and minimizes a signed linear score on their sorted right-edge counts. The first reduction represents an independent-set verification program by a tree growing level by level. A fixed-profile identity converts narrow coordinate restrictions into linear penalties that enforce the computation. The second reduction adds large dyadic terms to the symbol frequencies to force prescribed depths. These terms contribute a constant to the weighted number of ones, leaving smaller signed perturbations to reproduce the tree score.

Introduction

Let w1,…,wNw_1,\ldots,w_N be positive integer frequencies for N≥2N \ge2 source symbols. A binary prefix code is a tuple C=(C1,…,CN)\mathcal{C}=(C_1,\ldots,C_N) of distinct finite strings over the encoding alphabet {0,1}\{0,1\} such that no CiC_i is a prefix of another CjC_j. The string CiC_i is the codeword assigned to source symbol ii. Write ∣Ci∣0|C_i|_0 and ∣Ci∣1|C_i|_1 for its numbers of zeros and ones, and ∣Ci∣=∣Ci∣0+∣Ci∣1|C_i|=|C_i|_0+|C_i|_1 for its length. For example, {0,10,11}\{0,10,11\} is prefix-free, whereas {0,01,11}\{0,01,11\} is not. The prefix condition allows concatenated codewords to be decoded without separators.

In the classical binary prefix coding problem, the objective is to minimize the weighted length

L(C)=∑i=1Nwi∣Ci∣.L(\mathcal{C})=\sum_{i=1}^{N}w_i|C_i|.

Dividing by W=∑iwiW=\sum_i w_i gives the expected codeword length for symbol probabilities wi/Ww_i/W, so either objective gives the same optimal codes. Huffman [19] solved this fundamental problem in lossless source coding in 1952 by a greedy algorithm. With a priority queue, the algorithm uses O(Nlog⁡N)O(N\log N) arithmetic and comparison operations and runs in polynomial time for binary-encoded frequencies. This is the equal-letter-cost setting: if both encoding letters have a common positive cost cc, the weighted coding cost is simply cL(C)cL(\mathcal{C}).

In the unequal-letter-cost setting, the encoding letters have costs 0<c0<c10<c_0<c_1, shared by all source symbols. The cost of a codeword is the sum of the costs of its letters, and the total weighted cost is

cost⁡c0,c1(C)=∑i=1Nwi(c0∣Ci∣0+c1∣Ci∣1).\operatorname{cost}_{c_0,c_1}(\mathcal{C})=\sum_{i=1}^{N}w_i(c_0|C_i|_0+c_1|C_i|_1).

Thus composition matters as well as length: with costs (1,3)(1,3), the words 00 and 01 have the same length but costs two and four. Unequal letter costs model different transmission times or storage requirements; these applications and related coding models are surveyed in [1 Section 2.7] and discussed in [14, 16].

Binary Prefix Coding with Unequal Letter Costs. The input consists of positive integer frequencies w1,…,wNw_1,\ldots,w_N, with N≥2N \ge2, positive integer letter costs c0<c1c_0<c_1, and a nonnegative integer threshold KK, all encoded in binary. The question is whether there exists a binary prefix code C\mathcal{C} satisfying

cost⁡c0,c1(C)≤K.\operatorname{cost}_{c_0,c_1}(\mathcal{C})\le K.

The corresponding optimization problem omits KK and asks for a minimum-cost code. No order on the source symbols, codeword lengths, or shape of the code tree is prescribed.

Unequal-letter-cost coding has a long history, and Karp gave an integer-programming formulation in 1961 [21]. Nevertheless, when the letter costs are part of the input, the exact computational complexity had remained unresolved: even proving NP-hardness was a longstanding open problem. This question was explicitly highlighted in the approximation work of Golin, Mathieu, and Young [14], in its full version [16], and subsequently in [6 Section 4].

Our contribution

We resolve this longstanding open problem by proving NP-completeness for a binary encoding alphabet, even when the two letter costs differ by only one.

Theorem 1.1. Deciding whether there is a binary prefix code of cost at most KK is NP-complete, even when (c0,c1)=(M,M+1)(c_0,c_1)=(M,M+1) for a positive integer MM supplied as part of the instance. All frequencies, letter costs, and the threshold are encoded in binary.

Consequently, finding an exact minimum-cost code is NP-hard. Here MM varies with the input; it is not a fixed constant. This distinction is essential, since every fixed pair of positive integer letter costs admits an exact polynomial-time algorithm [17, 4]. Our reduction uses frequencies and letter costs that may have exponential magnitude but have polynomial binary encoding length. It establishes ordinary NP-hardness. Strong NP-hardness and the existence of a fully polynomial-time approximation scheme (FPTAS) remain open.

Secondary optimization among minimum-length codes. The construction also identifies a source of difficulty within ordinary prefix coding. Minimizing expected length can leave several optimal codes, and a secondary criterion can distinguish them. Such questions have a classical precedent: Schwartz [29] studied minimum-redundancy codes with minimum maximum codeword length and minimum total codeword length, and Kou [22] gave an algorithm for minimizing codeword-length variance among minimum-redundancy codes. We consider a different secondary criterion, depending on the actual encoding letters rather than just the codeword lengths.

For a code CC, define its weighted number of ones by

R(C)=∑i=1Nwi∣Ci∣1.R(C)=\sum_{i=1}^{N}w_i|C_i|_1.

Let

L∗(w)=min⁡CL(C),R∗(w)=min⁡C:L(C)=L∗(w)R(C).L^*(\mathbf{w})=\min_C L(C), \qquad R^*(\mathbf{w})=\min_{C:L(C)=L^*(\mathbf{w})}R(C).

Huffman's algorithm computes L∗(w)L^*(\mathbf{w}) in polynomial time. The secondary optimization problem asks for a code attaining R∗(w)R^*(\mathbf{w}): first minimize weighted length, and then, among all codes of that minimum length, minimize the weighted number of ones. Its decision version receives w=(w1,…,wN)\mathbf{w}=(w_1,\ldots,w_N) and an integer κ≥0\kappa\geq0, all encoded in binary, and asks whether R∗(w)≤κR^*(\mathbf{w})\leq\kappa. No particular Huffman tree is supplied or fixed. This criterion is also the remaining unequal-cost objective once weighted length has been minimized, since

cost⁡c0,c1(C)=c0L(C)+(c1−c0)R(C).\operatorname{cost}_{c_0,c_1}(C)=c_0L(C)+(c_1-c_0)R(C).

For costs (M,M+1)(M,M+1), this objective becomes ML+RML+R. Choosing MM sufficiently large gives weighted length priority over the weighted number of ones. Our frequency construction directly establishes NP-hardness of the secondary problem below. Choosing such an MM then transfers this hardness to unequal-letter-cost coding, yielding Theorem 1.1; the quantitative argument is given in § 4.3.

Corollary 1.2. Given positive integer frequencies w1,…,wNw_1,\ldots,w_N, with N≥2N\geq2, and a nonnegative integer threshold κ\kappa, all encoded in binary, it is NP-complete to decide whether some binary prefix code of minimum weighted length has weighted number of ones at most κ\kappa.

§ 2.4 presents the key ideas behind the reductions. The full proof of the corollary is given in § 4.4.

The corollary ranges over all minimum-length prefix codes, including different tree shapes, symbol assignments, and choices of which branches receive zero and one. In particular, minimizing the (1,2)(1,2)-cost L+RL+R subject to L=L∗(w)L=L^*(\mathbf{w}) is NP-hard. This does not contradict the O(N2)O(N^2) arithmetic-and-comparison bound for unrestricted optimization with the fixed costs (1,2)(1,2) [4]: that algorithm may trade a larger weighted length for a smaller weighted number of ones.

Prior work

Origins and motivation. Huffman’s minimum-redundancy construction [19] is the starting point for this line of research. Unequal-letter-cost coding has a long history, including Karp’s integer-programming formulation [21]; Abrahams [1 Section 2.7] surveys the problem and its connections with source coding and search trees. In addition to differing transmission times, unequal costs arise in storage models. For example, the coding literature relates run-length restrictions used in magnetic and optical storage to unequal costs by regarding strings 0j10^{j}1 as letters of cost j+1j+1 [14, 16]. These applications motivate optimizing letter costs rather than codeword lengths alone.

Exact algorithms. The known exact running times depend strongly on the letter costs. For positive integer costs with maximum value cc, Golin and Rote [17] gave an O(Nc+2)O(N^{c+2})-time dynamic program. Bradford, Golin, Larmore, and Rytter [4] improved the binary case to O(Nc)O(N^{c}) by exploiting the Monge property. Dumitrescu [11] obtained the same bound for every fixed number of encoding letters. Consequently, every fixed pair of positive integer letter costs admits an exact polynomial-time algorithm. These bounds do not give a polynomial-time algorithm when the costs themselves are supplied in binary as part of the input.

Approximation and the exact-complexity question. Early bounds and constructions were obtained by Krause [25], Mehlhorn [27], and Altenkamp and Mehlhorn [2]. Golin and Li [15] subsequently improved several algorithms and guarantees. Golin, Mathieu, and Young [14] gave a polynomial-time approximation scheme (PTAS), allowing input-dependent letter costs. They also emphasized the missing hardness result: “nor is the problem known to be NP-hard.” For each fixed ε>0\varepsilon> 0, a PTAS produces a code of cost at most (1+ε)(1+\varepsilon) times optimum in polynomial time. The full version [16] achieves running time O(N)+Oε(log⁡3N)O(N)+O_{\varepsilon}(\log^{3}N) after sorting, with the code represented by a tree. The hidden constant may depend on ε\varepsilon. These bounds, as well as the exact dynamic-programming bounds above, count arithmetic and comparison operations; their bit complexity also depends on the encoding lengths of the input numbers. The full approximation paper explicitly asks whether the exact problem is NP-complete and whether an FPTAS exists, with running time also polynomial in 1/ε1/\varepsilon. The exact-complexity question was still recorded as open by Banchhor, Gajjala, Sabharwal, and Sen [6 Section 4]. Theorem 1.1 answers the NP-completeness question but not the separate FPTAS question.

Special cases and related objectives. The equiprobable case has a separate line of exact algorithms [31, 9, 28, 23, 18], closely connected to optimal lopsided trees, whose branches have unequal costs [7]. Golin and Young [18] gave an O(Nlog⁡2r)O(N\log^{2}r)-time algorithm for rr encoding letters with sorted costs. For alphabetic coding, where source symbols must occur in a prescribed left-to-right order at the leaves, Itai [20] gave a polynomial-time algorithm permitting unequal letter costs. Neither equiprobable frequencies nor an alphabetic restriction is assumed here. Fujiwara and Jacobs [12 Theorem 3] prove NP-hardness for objectives over full binary trees with arbitrary nonnegative, symbol-dependent functions of ordinary depth, allowing nonmonotone costs. The full-tree restriction is essential to their hardness proof, as explained in [6 Appendix A.1]. Such functions can specify separate depth preferences for individual symbols. Our result uses ordinary frequencies and one common pair of positive letter costs (M,M+1)(M,M+1).

The intermediate problem and proof overview

Our source problem is Planar Independent Set. A graph is simple if it has no loops or multiple edges, and planar if it admits a drawing in the plane with no crossing edges. An independent set of a graph G=(V,E)G=(V,E) is a set S⊆VS\subseteq V such that no edge has both endpoints in SS.

Planar Independent Set (source problem). The input is a simple planar graph G=(V,E)G=(V,E) and an integer kk. The question is whether GG has an independent set of size at least kk.

This problem is NP-complete: a set is independent if and only if its complement is a vertex cover, and planar Vertex Cover is NP-complete [13]. For the corresponding optimization problem, the input is GG, feasible solutions are its independent sets, and the objective is to maximize their cardinality; write α(G)\alpha(G) for this maximum.

Our final target problem is Binary Prefix Coding with Unequal Letter Costs, defined in § 1, restricted to the letter costs (M,M+1)(M,M+1). The positive integer MM is supplied as part of the constructed instance, together with the positive frequencies; it is not a fixed constant. In its decision version, the instance also contains a coding-cost threshold KK.

The reduction has two stages. The first reduction maps the source problem to an auxiliary tree-scoring problem, which we call Minimum-Score Tree with Prescribed Leaf Profile and abbreviate as the leaf-profile problem. The second reduction maps the leaf-profile problem to the final coding problem. Figure 1 shows these two stages. § 3 gives the first reduction and its forward and reverse arguments; Appendices § 8 and B supply the local proofs, realization details, and score estimates. § 4 gives the second reduction and its full proof.

Two-stage reduction from Planar Independent Set through Minimum-score tree with prescribed leaf profile to Binary prefix coding

Figure 1. The two-stage reduction. The middle instance consists of a leaf profile and signed coefficient rows, not a tree. Both instance transformations are polynomial-time reductions.

Trees, depths, and coordinate profiles

A rooted ordered binary tree is a finite rooted tree with at most one left child and at most one right child at each vertex. A vertex with no children is a leaf; any other vertex is an internal vertex. The tree is full if every internal vertex has both children. Label left edges by zero and right edges by one. The root-to-leaf words then form a binary prefix code, and assigning source symbols to the leaves specifies their codewords. Conversely, a binary prefix code has such a tree representation, possibly with one-child vertices. With positive frequencies and letter costs, suppressing a vertex with only one child preserves the prefix property and strictly decreases both weighted length and coding cost. Repeating this operation produces a full code tree. Hence every optimal code is full, and every nonfull competitor can be improved to a full one.

The depth of a vertex is the number of edges on its path from the root; the root has depth zero. Its coordinate is the number of right edges on that path. Thus the path 010 has depth three and coordinate one. A vertex at depth dd and coordinate zz has children at depth d+1d+1 and coordinates zz and z+1z+1. The height of a tree is its largest vertex depth. A leaf at depth dd and coordinate zz represents a codeword of cost

M(d−z)+(M+1)z=Md+zM(d-z)+(M+1)z=Md+z

when the letter costs are (M,M+1)(M,M+1). This separates the contribution of depth from that of right edges and motivates the intermediate problem: prescribe the number of leaves at each depth and optimize a score on their coordinates.

A coordinate profile records these coordinates level by level, with multiplicities. Let XtX_t be the sorted multiset of coordinates of the internal vertices at depth tt. For a multiset XX, let E(X)\mathcal{E}(X) contain zz and z+1z+1 for every occurrence of z∈Xz\in X. A full tree of height at most HH, with an internal root, gives

X0={0},Xt⊆E(Xt−1)(1≤t≤H),XH=∅.X_0=\{0\},\qquad X_t\subseteq\mathcal{E}(X_{t-1})\quad(1\le t\le H),\qquad X_H=\varnothing.

where inclusion is multiset inclusion. The leaf-coordinate multiset at depth tt is

Lt=E(Xt−1)−Xt.L_t=\mathcal{E}(X_{t-1})-X_t.

For example, E({0,1})={0,1,1,2}\mathcal{E}(\{0,1\})=\{0,1,1,2\} retains both occurrences of coordinate one.

Conversely, every such sequence is realized by a full ordered binary tree: at each level, retain child occurrences with the coordinates prescribed by XtX_t as internal and make the other children leaves. Multiset inclusion guarantees each selection. Equal-coordinate occurrences have the same possible descendant coordinates, so choosing among them does not affect later selections. A coordinate profile need not determine a unique concrete tree, but all its realizations have the same leaf depths and leaf-coordinate lists.

The leaf-profile problem

The leaf profile of a tree of height HH is the sequence (n1,…,nH)(n_1,\ldots,n_H), where ntn_t is the number of leaves at depth tt. Unlike a coordinate profile, it records only counts, not coordinates. A prescribed leaf profile is feasible if at least one full ordered binary tree has exactly those leaf counts and no other leaves. We consider only feasible profiles.

Minimum-Score Tree with Prescribed Leaf Profile.

Input. A feasible leaf profile (n1,…,nH)(n_1,\ldots,n_H), with nH>0n_H>0 and N=∑t=1Hnt≥2N=\sum_{t=1}^{H}n_t\ge2, and an integer coefficient list for each depth tt:

ut,1≥ut,2≥⋯≥ut,nt.u_{t,1}\ge u_{t,2}\ge\cdots\ge u_{t,n_t}.

There is one explicitly listed coefficient for each depth-position pair

(t,k)∈P:={(t,k):1≤t≤H, 1≤k≤nt}.(t,k)\in\mathcal{P}:=\{(t,k):1\le t\le H,\ 1\le k\le n_t\}.

All integers are encoded in binary. The coefficients may be negative; a depth with nt=0n_t=0 has an empty coefficient list.

Feasible solution. A full ordered binary tree TT with exactly ntn_t leaves at every depth tt and no leaves at other depths.

Objective. At each depth tt, sort the coordinates of the leaves of TT in nondecreasing order, retaining repetitions:

zt,1(T)≤⋯≤zt,nt(T).z_{t,1}(T)\le\cdots\le z_{t,n_t}(T).

Minimize

score⁡(T)=∑t=1H∑k=1ntut,kzt,k(T).(1)\operatorname{score}(T)=\sum_{t=1}^{H}\sum_{k=1}^{n_t}u_{t,k}z_{t,k}(T). \tag*{(1)}

References

  1. [1][Abr01] J. Abrahams. Code and Parse Trees for Lossless Source Encoding. Communications in Information and Systems, 1(2):113–146, 2001.DOI
  2. [2]D. Altenkamp and K. Mehlhorn. Codes: Unequal Probabilities, Unequal Letter Costs. Journal of the ACM, 27(3):412–427, 1980. doi:10.1145/322203.322205.DOI
  3. [3]J. Argelich, I. Lynce, and J. Marques-Silva. On Solving Boolean Multilevel Optimization Problems. In IJCAI, pages 393–398, 2009.arxiv.org/abs/0904.0019
  4. [4]P. G. Bradford, M. J. Golin, L. L. Larmore, and W. Rytter. Optimal Prefix-Free Codes for Unequal Letter Costs: Dynamic Programming with the Monge Property. Journal of Algorithms, 42(2):277–303, 2002. doi:10.1006/jagm.2002.1213.DOI
  5. [6]S. Banchhor, R. Gajjala, Y. Sabharwal, and S. Sen. Generalizations of Length Limited Huffman Coding for Hierarchical Memory Settings. In FSTTCS, volume 213 of LIPIcs, pages 8:1–8:23, 2021. doi:10.4230/LIPIcs.FSTTCS.2021.8.DOI
  6. [7]V. Choi and M. J. Golin. Lopsided Trees, I: Analyses. Algorithmica, 31(3):240–290, 2001. doi:10.1007/s00453-001-0063-1.DOI
  7. [8]S. A. Cook. The Complexity of Theorem-Proving Procedures. In STOC, pages 151–158, 1971. doi:10.1145/800157.805047.DOI
  8. [9]N. Cot. Complexity of the Variable-Length Encoding Problem. In Proceedings of the Sixth Southeastern Conference on Combinatorics, Graph Theory and Computing, volume 14 of Congressus Numerantium, 1975.
  9. [11]S. Dumitrescu. Faster Algorithm for Designing Optimal Prefix-Free Codes with Unequal Letter Costs. Fundamenta Informaticae, 73(1–2):107–117, 2006. doi:10.3233/FUN-2006-731-210.
  10. [12]H. Fujiwara and T. Jacobs. On the Huffman and Alphabetic Tree Problem with General Cost Functions. Algorithmica, 69(3):582–604, 2014. doi:10.1007/s00453-013-9755-6.DOI
  11. [13]M. R. Garey, D. S. Johnson, and L. Stockmeyer. Some Simplified NP-Complete Graph Problems. Theoretical Computer Science, 1(3):237–267, 1976. doi:10.1016/0304-3975(76)90059-1.DOI
  12. [14]M. J. Golin, C. Kenyon, and N. E. Young. Huffman Coding with Unequal Letter Costs. In STOC, pages 785–791, 2002. doi:10.1145/509907.510020.DOI
  13. [15]M. J. Golin and J. Li. More Efficient Algorithms and Analyses for Unequal Letter Cost Prefix-Free Coding. IEEE Transactions on Information Theory, 54(8):3412–3424, 2008. doi:10.1109/TIT.2008.926326.DOI
  14. [16]M. J. Golin, C. Mathieu, and N. E. Young. Huffman Coding with Letter Costs: A Linear-Time Approximation Scheme. SIAM Journal on Computing, 41(3):684–713, 2012. doi:10.1137/100794092.DOI
  15. [17]M. J. Golin and G. Rote. A Dynamic Programming Algorithm for Constructing Optimal Prefix-Free Codes with Unequal Letter Costs. IEEE Transactions on Information Theory, 44(5):1770–1781, 1998. doi:10.1109/18.705558.DOI
  16. [18]M. J. Golin and N. Young. Prefix Codes: Equiprobable Words, Unequal Letter Costs. SIAM Journal on Computing, 25(6):1281–1292, 1996. doi:10.1137/S0097539794268388.DOI
  17. [19]D. A. Huffman. A Method for the Construction of Minimum-Redundancy Codes. Proceedings of the IRE, 40(9):1098–1101, 1952. doi:10.1109/JRPROC.1952.273898.DOI
  18. [20]A. Itai. Optimal Alphabetic Trees. SIAM Journal on Computing, 5(1):9–18, 1976. doi:10.1137/0205002.DOI
  19. [21]R. M. Karp. Minimum-Redundancy Coding for the Discrete Noiseless Channel. IRE Transactions on Information Theory, 7(1):27–38, 1961. doi:10.1109/TIT.1961.1057615.DOI
  20. [22]L. T. Kou. Minimum Variance Huffman Codes. SIAM Journal on Computing, 11(1):138–148, 1982. doi:10.1137/0211011.DOI
  21. [23]S. Kapoor and E. M. Reingold. Optimum Lopsided Binary Trees. Journal of the ACM, 36(3):573–590, 1989. doi:10.1145/65950.65955.DOI
  22. [24]L. G. Kraft. A Device for Quantizing, Grouping, and Coding Amplitude-Modulated Pulses. Master’s thesis, Massachusetts Institute of Technology, 1949. hdl:1721.1/12390.
  23. [25]R. M. Krause. Channels Which Transmit Letters of Unequal Duration. Information and Control, 5(1):13–24, 1962. doi:10.1016/S0019-9958(62)90183-3.DOI
  24. [27]K. Mehlhorn. An Efficient Algorithm for Constructing Nearly Optimal Prefix Codes. IEEE Transactions on Information Theory, 26(5):513–517, 1980. doi:10.1109/TIT.1980.1056250.DOI
  25. [28]Y. Perl, M. R. Garey, and S. Even. Efficient Generation of Optimal Prefix Code: Equiprobable Words Using Unequal Cost Letters. Journal of the ACM, 22(2):202–214, 1975. doi:10.1145/321879.321883.DOI
  26. [29]E. S. Schwartz. An Optimum Encoding with Minimum Longest Code and Total Number of Digits. Information and Control, 7(1):37–44, 1964. doi:10.1016/S0019-9958(64)90241-4.DOI
  27. [30]C. E. Shannon. A Mathematical Theory of Communication. Bell System Technical Journal, 27(3):379–423, 1948. doi:10.1002/j.1538-7305.1948.tb01338.x.DOI
  28. [31]B. Varn. Optimal Variable Length Codes (Arbitrary Symbol Cost and Equal Code Word Probability). Information and Control, 19(4):289–301, 1971. doi:10.1016/S0019-9958(71)90155-0.DOI

Paper details

vlnc:W_hj8nbcmv
v1 · latestHistory (1)

published · Fresh — added to the Hub within the last 30 days

added ·

Usage

views · 8

downloads · 0

A view counts once per browser per day, a download each time the PDF is requested.

CC BY 4.0

Original source

  • Computer Science

Not recorded for this paper · View statement →

Looking for related papers…
Contents