Exemple #1
0
def build_trie(n, genes, health):
    trie = Trie()

    for i in range(n):
        gene_trie = trie.add(genes[i])
        add_health_to_gene_trie(gene_trie, health[i], i)

    return trie
Exemple #2
0
def test_add_health_to_gene_trie_when_add_to_beginning():
    trie = Trie('a')
    trie.value = [DataItem(2, 8)]
    index = 1
    health = 4

    add_health_to_gene_trie(trie, health, index)
    result = trie.value

    assert len(result) == 2
    assert result[0].index == 1
    assert result[0].sum == 4

    assert result[1].index == 2
    assert result[1].sum == 12
Exemple #3
0
def test_when_inserting_all_nodes_a_node_should_have_len_2():
    trie = Trie()

    trie.add(test_str_1)
    trie.add(test_str_2)
    trie.add(test_str_3)
    trie.add(test_str_4)
    trie.add(test_str_5)
    trie.add(test_str_6)

    a_node = trie.find_node('a')
    assert len(a_node.children) == 2
Exemple #4
0
def test_should_return_same_inserted_values():
    trie = Trie()
    try_test_value(trie, test_str_1)
    try_test_value(trie, test_str_2)
    try_test_value(trie, test_str_3)
    try_test_value(trie, test_str_4)
    try_test_value(trie, test_str_5)
    try_test_value(trie, test_str_6)
Exemple #5
0
def test_add_health_to_gene_trie_when_add_to_end():
    trie = Trie('a')
    trie.value = [DataItem(2, 8), DataItem(5, 14)]
    index = 7
    health = 4

    add_health_to_gene_trie(trie, health, index)
    result = trie.value

    assert len(result) == 3
    assert result[0].index == 2
    assert result[0].sum == 8

    assert result[1].index == 5
    assert result[1].sum == 14

    assert result[2].index == 7
    assert result[2].sum == 18
Exemple #6
0
def count_health(genes_data, firstIndex, lastIndex, stream):
    total_health = 0
    genes_count_cache = Trie()

    for i in range(firstIndex, lastIndex + 1):
        gene = genes_data.genes[i]
        health = genes_data.health[i]

        gene_count_cache_node = genes_count_cache.find_node(gene)

        if gene_count_cache_node == None:
            prefix_array = genes_data.prefix_arrays[i]
            appear_positions = kmp(gene, stream, prefix_array)
            gene_count_cache_node = genes_count_cache.add(gene)
            gene_count_cache_node.value = len(appear_positions)

        total_health += gene_count_cache_node.value * health

    return total_health
Exemple #7
0
def test_when_not_found_should_return_none():
    trie = Trie()
    trie.add(test_str_1)
    trie.add(test_str_2)
    trie.add(test_str_3)

    testNode = trie.find_node(test_str_not_found)

    assert testNode == None
Exemple #8
0
def test_add_health_to_gene_trie_when_empty_should_add_new_data_item():
    trie = Trie('a')
    index = 2
    health = 13

    add_health_to_gene_trie(trie, health, index)
    result = trie.value

    assert len(result) == 1
    assert result[0].index == index
    assert result[0].sum == health
Exemple #9
0
def test_add_health_to_gene_trie_when_inserting_in_middle_should_insert_in_correct_position_and_update_forward_sum():
    trie = Trie('a')
    trie.value = [DataItem(2, 8), DataItem(5, 14), DataItem(6, 19)]
    index = 3
    health = 4

    add_health_to_gene_trie(trie, health, index)
    result = trie.value

    assert len(result) == 4
    assert result[0].index == 2
    assert result[0].sum == 8

    assert result[1].index == 3
    assert result[1].sum == 12

    assert result[2].index == 5
    assert result[2].sum == 18

    assert result[3].index == 6
    assert result[3].sum == 23
Exemple #10
0
def test_when_empty_string_should_return_root():
    trie = Trie()

    testNode = trie.find_node('')
    assert not testNode == None
Exemple #11
0
    def test_find_prefix(self):
        """Test for find_prefid

        Args:
            self: TestTrie

        Returns:
            None

        Raises:
            None
        """
        # Given
        trie_obj = Trie()

        # When
        trie_obj.add("hello")
        trie_obj.add("hell")
        trie_obj.add("he")
        trie_obj.add("she")

        # Then
        self.assertEqual(trie_obj.find_prefix("he"), (True, 3))
        self.assertEqual(trie_obj.find_prefix("hell"), (True, 2))
        self.assertEqual(trie_obj.find_prefix("hello"), (True, 1))
        self.assertEqual(trie_obj.find_prefix("h"), (True, 3))
        self.assertEqual(trie_obj.find_prefix("me"), (False, 0))
Exemple #12
0
        self.genes = genes
        self.health = health
        self.prefix_arrays = prefix_arrays


#!/bin/python
if __name__ == '__main__':
    n = int(raw_input())

    genes = raw_input().rstrip().split()

    health = map(int, raw_input().rstrip().split())

    s = int(raw_input())

    genes_prefix_cache_trie = Trie()
    prefix_arrays = [None for g in genes]

    # calculate the prefix arrays by using a trie as cache
    for i in range(len(genes)):
        gene = genes[i]
        cache_trie_node = genes_prefix_cache_trie.find_node(gene)
        if cache_trie_node != None:
            prefix_arrays[i] = cache_trie_node.value
        else:
            prefix_arrays[i] = kmp_initialize_suffix_prefix_array(gene)
            cache_trie_node = genes_prefix_cache_trie.add(gene)
            cache_trie_node.value = prefix_arrays[i]

    genes_data = GenesData(genes, health, prefix_arrays)