从Move-To-Front encoding的一个常用问题:把一个元素放到最前面

在MTF的encoding中,主要就是把要encode的string和symbol table比较,将对应的index保存并把相同的值放到symbol table的最前头。

eg: string = caaabaa...

symbol table = 0123abcd...

则要得到:c0123abd...

所以主要问题就是把中间一段和c交换位置。

方法一:2次循环,第一次,在symbol table一个一个比较,找到string这个元素在ST中的ind。第2次,把ST中找到的相同元素一个一个的和前一个交换,知道它换到最前面。

方法二:msi的做法:只用一次循环,自己画了个step by step才想到。好厉害的for loop写法和temp var的运用。tmpout好机智。

public static void encode() throws IOException {
        char[] chars = radixList();
        char count, ch, tmpin, tmpout;
        while (!BinaryStdIn.isEmpty()) {
            ch = BinaryStdIn.readChar();
            for (count = 0, tmpout = chars[0]; ch != chars[count]; count++) {
                tmpin = chars[count];
                chars[count] = tmpout;
                tmpout = tmpin;
            }
            chars[count] = tmpout;
            BinaryStdOut.write(count);
            chars[0] = ch;
        }
        BinaryStdOut.close();
    }

从Move-To-Front encoding的一个常用问题:把一个元素放到最前面

时间: 2024-10-29 19:06:10

从Move-To-Front encoding的一个常用问题:把一个元素放到最前面的相关文章

开源一个常用的小软件的源码——系统数据库服务管理软件

郝喜路  2014年7月27日22:28:34 GitHub地址:https://github.com/haoxilu/ServiceManager    希望编程爱好者 更改添加...   开发环境:Visual Studio 2012   .Net Framework 4.0 大家在软件开发过程中,是离不开 数据库的,不管你用什么数据库,都会在系统服务上注册一个,当你安装了太多的数据库,是否有感到极大的拖掉了开机时间,影响了计算机的性能.(仅限windows系统).这时有的朋友可能会想到手动

C++中一个常用的句型(两个for(;;)语句连用的重要性)

在一些简单的C++编程中,经常会用到两个for(;;)语句连用的情况,这是一个常用句型,因此感觉也非常重要.下面举两个例子说明一下: 例1.用两个for(;;)语句来进行数组元素大小的排序 #include"stdafx.h" #include<iostream> using namespace std; int main() { int i,j,t=0; int a[10]={0}; //用for循环连续输入10个数存放在数组中 for(i=0;i<10;i++)

比较两个文件中,一个文件比另一个文件多的行

1. 该脚本用来比较两个文件中,其中一个文件比另一个文件多的行,常用来工作环境中,对比得出多余的ip地址 #!/bin/bash #different in file1 and file2 #author:vaedit #date:2017/8/20 #read -p "请输入第一个文件路径" file1 #read -p "请输入第二个文件路径" file2 function print_help(){ echo "该脚本只用来对比一个文件比另一个文件多

Linux rm(删除一个目录中的一个或多个文件或目录或删除非空目录)

rm命令.rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除.对于链接文件,只是删除了链接,原有文件均保持不变. rm是一个危险的命令,使用的时候要特别当心,尤其对于新手,否则整个系统就会毁在这个命令(比如在/(根目录)下执行rm * -rf).所以,我们在执行rm之前最好先确认一下在哪个目录,到底要删除什么东西,操作时保持高度清醒的头脑. 命令格式: rm [选项] 文件- 命令功能: 删除一个目录中的一个或多个文件或目录,如

从一个程序员到一个销售高手的心路历程

从一个程序员到一个销售高手的心路历程 0.引言 我大学本科读的是理工科,后来毕业以后,我逐渐走上了程 序员的道路.每天面对电脑一行一行的敲代码,这被我们程序员们戏称为“搬砖头”,因为我们所做的事跟民工搬砖头砌墙本质上是相同的,我们也是把一堆代码从 一个地方搬到另一个地方,然后改改让它面子上看起来挺好看,用起来结实耐用就算完工了. 干了6年的技术以后,我放弃了已做的非常 好的技术和积累起来的成绩,转而从0开始去做销售.后来经过自己的努力,我终于成长为一个销售和业绩翻倍高手,在销售和业绩翻倍方面取得

Android从一个应用启动另一个主界面隐藏图标的应用

用a.apk启动b.apk,并且b的图标是在手机主界面上看不到的. 一.新建a,b两个android项目(新建helloworld项目相似),在a项目中增加点击事件(启动按钮来启动b应用).      二.在b应用中修改b manifest.xml中<intent-filter>...</intent-filter>的内容就可以隐藏b应用的图标了. <?xml version="1.0" encoding="utf-8"?> &l

自定义常用input表单元素三:纯css实现自定义Switch开关按钮

自定义常用input表单元素的第三篇,自定义一个Switch开关,表面上看是和input没关系,其实这里采用的是checkbox的checked值的切换.同样,采用css伪类和"+"css选择器为思路,下面是预览图: 下面先放HTML代码,看下DOM结构: <input type="checkbox" id="my_switch" class="my_switch"> <label for="my_

如何用一个app操作另外一个app.比如微信群控那样的

如何实现一个app.控制另外的app,比如市面上群控微信的,是用测试工具的原理?还是什么模拟点击的原理? 如何用一个app操作另外一个app.比如微信群控那样的 >> android 这个答案描述的挺清楚的:http://www.goodpm.net/postreply/android/1010000007186891/如何用一个app操作另外一个app比如微信群控那样的.html

一个接口能否继承另一个接口?一个抽象类能否实现一个接口?

都可以: 一.一个接口能否继承另一个接口? 接口继承接口  本质就是一个抽象类继承另一个抽象类(它们都没写方法的实例).当一个类继承了一个抽象类,它必须要重写父类 抽象类中的抽象方法,如果不去重写父类抽象方法的实例,那么这个类也是抽象类(这个抽象子类,直到重写这个抽象方法的实例为止, 才能摆脱抽象的命运).其实我们想想,一个类去实现一个接口也不就是一个实体子类把一个抽象的所以抽象方法实例化(重写了 抽象父类 中全部抽象方法),当然抽象类和接口还是有区别的.我上上篇就写到了抽象类和接口的区别,有兴