Welcome to collectivesolver - Programming & Software Q&A with code examples. A website with trusted programming answers. All programs are tested and work.

Contact: aviboots(AT)netvision.net.il

Semrush - keyword research tool

Turn ChatGPT, Claude, Gemini, And CoPilot Into Your Personal Assistant, Business Coach, Content Creator, And More

AFFILIATE MARKETING Your all-in-one performance engine Manage affiliates, creators, and customer referrals in one unified platform—turning every partnership into measurable growth
Secure & Reliable Web Hosting, Free Domain, Free SSL, 1-Click WordPress Install, Expert 24/7 Support

Boost your online presence with premium web hosting and servers

Disclosure: My content contains affiliate links.

42,623 questions

55,358 answers

573 users

How to perform high‑performance reversible text compression using a word dictionary in Kotlin

1 Answer

0 votes
/*
    =====================================================================
    High‑Performance Reversible Text Compression Using a Word Dictionary
    ---------------------------------------------------------------------
    This program compresses text by replacing repeated words with tokens
    like @0, @1, @2... and stores each unique word in a dictionary.

    The compressed text is fully reversible.

    WHY THIS VERSION IS FAST (Kotlin):
    ----------------------------------
    • Uses HashMap<String, Int> for O(1) average lookup.
    • Uses MutableList<String> for compact dictionary storage.
    • Manual scanning avoids regex overhead.
    • Uses StringBuilder for efficient string construction.
    • Clean, idiomatic, modern Kotlin design.
    =====================================================================
*/

import kotlin.text.StringBuilder

// ---------------------------------------------------------------------
// Dictionary structure: MutableList + HashMap
// ---------------------------------------------------------------------
class WordDictionary {
    val words: MutableList<String> = mutableListOf()          // index → word
    val indexMap: HashMap<String, Int> = HashMap()            // word → index
}

// ---------------------------------------------------------------------
// Find or add a word to the dictionary (O(1) average)
// ---------------------------------------------------------------------
fun findOrAdd(dict: WordDictionary, word: String): Int {
    dict.indexMap[word]?.let { return it }

    val newIndex = dict.words.size
    dict.words.add(word)
    dict.indexMap[word] = newIndex
    return newIndex
}

// ---------------------------------------------------------------------
// Compress text into @ID tokens
// ---------------------------------------------------------------------
fun compress(input: String, dict: WordDictionary): String {
    val out = StringBuilder(input.length * 2)
    var i = 0
    val n = input.length

    while (i < n) {
        val c = input[i]

        // Pass punctuation/spaces directly
        if (!c.isLetterOrDigit()) {
            out.append(c)
            i++
            continue
        }

        // Extract word
        val start = i
        while (i < n && input[i].isLetterOrDigit()) {
            i++
        }

        val word = input.substring(start, i)

        // Get dictionary index
        val id = findOrAdd(dict, word)

        // Write token
        out.append('@').append(id)
    }

    return out.toString()
}

// ---------------------------------------------------------------------
// Decompress @ID tokens back into original text
// ---------------------------------------------------------------------
fun decompress(compressed: String, dict: WordDictionary): String {
    val out = StringBuilder(compressed.length * 2)
    var i = 0
    val n = compressed.length

    while (i < n) {
        val c = compressed[i]

        // Token?
        if (c == '@') {
            i++
            var id = 0

            // Parse digits
            while (i < n && compressed[i].isDigit()) {
                id = id * 10 + (compressed[i] - '0')
                i++
            }

            if (id in dict.words.indices) {
                out.append(dict.words[id])
            }
        } else {
            // Pass punctuation/spaces
            out.append(c)
            i++
        }
    }

    return out.toString()
}

// ---------------------------------------------------------------------
// Main
// ---------------------------------------------------------------------
fun main() {
    val original =
        "this is is a test test compression string string test " +
        "this is a test compression"

    val dict = WordDictionary()

    val compressed = compress(original, dict)
    val decompressed = decompress(compressed, dict)

    println("Original:      \"$original\"")
    println("Compressed:    \"$compressed\"")
    println("Decompressed:  \"$decompressed\"\n")

    println("Dictionary:")
    dict.words.forEachIndexed { i, w ->
        println("  @$i => $w")
    }
}


/*
run:

Original:      "this is is a test test compression string string test this is a test compression"
Compressed:    "@0 @1 @1 @2 @3 @3 @4 @5 @5 @3 @0 @1 @2 @3 @4"
Decompressed:  "this is is a test test compression string string test this is a test compression"

Dictionary:
  @0 => this
  @1 => is
  @2 => a
  @3 => test
  @4 => compression
  @5 => string

*/

 



answered Aug 1 by avibootz

Related questions

...