zoukankan      html  css  js  c++  java
  • 《算法》第三章部分程序 part 1

    ▶ 书中第三章部分程序,加上自己补充的代码,包括单词频率统计,(单链表)顺序查找表,二分查找表

    ● 单词频率统计

     1 package package01;
     2 
     3 import edu.princeton.cs.algs4.StdIn;
     4 import edu.princeton.cs.algs4.ST;
     5 import edu.princeton.cs.algs4.StdOut;
     6         
     7 public class class01
     8 {
     9     private class01() {}
    10 
    11     public static void main(String[] args)
    12     {
    13         int distinct = 0, words = 0;
    14         int minlen = Integer.parseInt(args[0]);     // 第一个参数,参与统计的单词长度下限
    15         ST<String, Integer> st = new ST<String, Integer>();
    16 
    17         for(;!StdIn.isEmpty();)
    18         {
    19             String key = StdIn.readString();
    20             if (key.length() < minlen)              // 过短的单词不参与处理
    21                 continue;
    22             words++;
    23             if (st.contains(key))                   // 已有就计数 +1,没有就新添记录
    24                 st.put(key, st.get(key) + 1);
    25             else
    26             {
    27                 st.put(key, 1);
    28                 distinct++;
    29             }
    30         }
    31 
    32         String max = "";                            // 迭代器遍历符号表,查找频率最高的单词
    33         st.put(max, 0);
    34         for (String word : st.keys())
    35         {
    36             if (st.get(word) > st.get(max))
    37                 max = word;
    38         }
    39         StdOut.println(max + " " + st.get(max));
    40         StdOut.println("distinct = " + distinct);
    41         StdOut.println("words    = " + words);
    42     }
    43 }

    ● (单链表)顺序查找表

      1 package package01;
      2 
      3 import edu.princeton.cs.algs4.Queue;
      4 import edu.princeton.cs.algs4.StdIn;
      5 import edu.princeton.cs.algs4.StdOut;
      6 
      7 public class class01<Key, Value>
      8 {
      9     private int n;
     10     private Node first;
     11 
     12     private class Node
     13     {
     14         private Key key;
     15         private Value val;
     16         private Node next;
     17 
     18         public Node(Key inputKey, Value inputVal, Node inputNext)
     19         {
     20             key = inputKey;
     21             val = inputVal;
     22             next = inputNext;
     23         }
     24     }
     25 
     26     public class01() {}
     27 
     28     public int size()
     29     {
     30         return n;
     31     }
     32 
     33     public boolean isEmpty()
     34     {
     35         return size() == 0;
     36     }
     37 
     38     public boolean contains(Key key)                    // 判断是否存在键 key
     39     {
     40         if (key == null)
     41             throw new IllegalArgumentException("
    <contains> key == null.
    ");
     42         return get(key) != null;
     43     }
     44 
     45     public Value get(Key key)                           // 查询元素的值
     46     {
     47         if (key == null)
     48             throw new IllegalArgumentException("
    <get> key == null.
    ");
     49         for (Node x = first; x != null; x = x.next)
     50         {
     51             if (key.equals(x.key))
     52                 return x.val;
     53         }
     54         return null;
     55     }
     56 
     57     public void put(Key key, Value val)                 // 插入元素
     58     {
     59         if (key == null)
     60             throw new IllegalArgumentException("
    <put> key == null.
    ");
     61         if (val == null)                                // 空值用于删除
     62         {
     63             delete(key);
     64             return;
     65         }
     66         for (Node x = first; x != null; x = x.next)
     67         {
     68             if (key.equals(x.key))
     69             {
     70                 x.val = val;
     71                 return;
     72             }
     73         }
     74         first = new Node(key, val, first);
     75         n++;
     76     }
     77 
     78     public void delete(Key key)                         // 删除元素
     79     {
     80         if (key == null)
     81             throw new IllegalArgumentException("
    <delete> key == null.
    ");
     82         first = deleteKernel(first, key);
     83     }
     84 
     85     private Node deleteKernel(Node x, Key key)          // 删除元素的递归内核
     86     {
     87         if (x == null)
     88             return null;
     89         if (key.equals(x.key))                  // x 头节点的键等于 key
     90         {
     91             n--;
     92             return x.next;
     93         }
     94         x.next = deleteKernel(x.next, key);     // 递归删除目标节点,需要用栈保存从链表开头到目标节点之间的所有节点
     95         return x;
     96     }
     97 
     98     public Iterable<Key> keys()                 // 将单链表依次入队,构成迭代器
     99     {
    100         Queue<Key> queue = new Queue<Key>();
    101         for (Node x = first; x != null; x = x.next)
    102             queue.enqueue(x.key);
    103         return queue;
    104     }
    105 
    106     public static void main(String[] args)
    107     {
    108         class01<String, Integer> st = new class01<String, Integer>();
    109         for (int i = 0; !StdIn.isEmpty(); i++)
    110         {
    111             String key = StdIn.readString();
    112             st.put(key, i);
    113         }
    114         for (String s : st.keys())
    115             StdOut.println(s + " " + st.get(s));
    116     }
    117 }

    ● 二分查找表

      1 package package01;
      2 
      3 import java.util.NoSuchElementException;
      4 import edu.princeton.cs.algs4.Queue;
      5 import edu.princeton.cs.algs4.StdIn;
      6 import edu.princeton.cs.algs4.StdOut;
      7 
      8 public class class01<Key extends Comparable<Key>, Value>
      9 {
     10     private Key[] keys;
     11     private Value[] vals;
     12     private int n = 0;
     13 
     14     public class01()
     15     {
     16         this(2);                                    // 省缺初始尺寸为 2
     17     }
     18 
     19     public class01(int capacity)
     20     {
     21         keys = (Key[]) new Comparable[capacity];
     22         vals = (Value[]) new Object[capacity];
     23     }
     24 
     25     private void resize(int capacity)               // 尺寸扩展为 capacity
     26     {
     27         assert capacity >= n;
     28         Key[]   tempk = (Key[]) new Comparable[capacity];
     29         Value[] tempv = (Value[]) new Object[capacity];
     30         for (int i = 0; i < n; i++)
     31         {
     32             tempk[i] = keys[i];
     33             tempv[i] = vals[i];
     34         }
     35         vals = tempv;
     36         keys = tempk;
     37     }
     38 
     39     public int size()
     40     {
     41         return n;
     42     }
     43 
     44     public boolean isEmpty()
     45     {
     46         return size() == 0;
     47     }
     48 
     49     public boolean contains(Key key)
     50     {
     51         if (key == null)
     52             throw new IllegalArgumentException("
    <contains> key == null.
    ");
     53         return get(key) != null;
     54     }
     55 
     56     public Value get(Key key)
     57     {
     58         if (key == null)
     59             throw new IllegalArgumentException("
    <get> key == null.
    ");
     60         if (isEmpty())
     61             return null;
     62         int i = rank(key);
     63         if (i < n && keys[i].compareTo(key) == 0)
     64             return vals[i];
     65         return null;
     66     }
     67 
     68     public int rank(Key key)                    // 二分搜索
     69     {
     70         if (key == null)
     71             throw new IllegalArgumentException("
    <rank> key == null.
    ");
     72         int lo = 0, hi = n - 1;
     73         for (; lo <= hi;)
     74         {
     75             int mid = lo + (hi - lo) / 2;
     76             int cmp = key.compareTo(keys[mid]);
     77             if (cmp < 0)
     78                 hi = mid - 1;
     79             else if (cmp > 0)
     80                 lo = mid + 1;
     81             else return mid;
     82         }
     83         return lo;
     84     }
     85 
     86     public void put(Key key, Value val)
     87     {
     88         if (key == null)
     89             throw new IllegalArgumentException("
    <put> key == null.
    ");
     90         if (val == null)
     91         {
     92             delete(key);
     93             return;
     94         }
     95         int i = rank(key);
     96         if (i < n && keys[i].compareTo(key) == 0)
     97         {
     98             vals[i] = val;
     99             return;
    100         }
    101         if (n == keys.length)
    102             resize(2 * keys.length);
    103         for (int j = n; j > i; j--)
    104         {
    105             keys[j] = keys[j - 1];
    106             vals[j] = vals[j - 1];
    107         }
    108         keys[i] = key;
    109         vals[i] = val;
    110         n++;
    111         //assert check();
    112     }
    113 
    114     public void delete(Key key)
    115     {
    116         if (key == null)
    117             throw new IllegalArgumentException("
    <delete> key == null.
    ");
    118         if (isEmpty())
    119             return;
    120         int i = rank(key);
    121         if (i == n || keys[i].compareTo(key) != 0)
    122             return;
    123         for (int j = i; j < n - 1; j++)             // 删除节点时要依次挪动
    124         {
    125             keys[j] = keys[j + 1];
    126             vals[j] = vals[j + 1];
    127         }
    128         n--;
    129         keys[n] = null;                             // 方便垃圾回收
    130         vals[n] = null;
    131         if (n > 0 && n == keys.length / 4)
    132             resize(keys.length / 2);
    133         //assert check();
    134     }
    135 
    136     public void deleteMin()
    137     {
    138         if (isEmpty())
    139             throw new NoSuchElementException("
    <deleteMin> underflow.
    ");
    140         delete(min());
    141     }
    142 
    143     public void deleteMax()
    144     {
    145         if (isEmpty())
    146             throw new NoSuchElementException("
    <deleteMax> underflow.
    ");
    147         delete(max());
    148     }
    149 
    150     public Key min()
    151     {
    152         if (isEmpty())
    153             throw new NoSuchElementException("
    <min> empty.
    ");
    154         return keys[0];
    155     }
    156 
    157     public Key max()
    158     {
    159         if (isEmpty())
    160             throw new NoSuchElementException("
    <max> empty.
    ");
    161         return keys[n - 1];
    162     }
    163 
    164     public Key select(int k)
    165     {
    166         if (k < 0 || k >= size())
    167             throw new IllegalArgumentException("
    <select> k < 0 || k >= size.
    ");
    168         return keys[k];
    169     }
    170 
    171     public Key floor(Key key)                       // 返回 key 的上一个元素
    172     {
    173         if (key == null)
    174             throw new IllegalArgumentException("
    <floor> key == null.
    ");
    175         int i = rank(key);
    176         if (i < n && key.compareTo(keys[i]) == 0)
    177             return keys[i];
    178         if (i == 0)
    179             return null;
    180         else return keys[i - 1];
    181     }
    182 
    183     public Key ceiling(Key key)                     // 返回 key 的下一个元素
    184     {
    185         if (key == null)
    186             throw new IllegalArgumentException("
    <ceiling> key == null.
    ");
    187         int i = rank(key);
    188         if (i == n)
    189             return null;
    190         else return keys[i];
    191     }
    192 
    193     public int size(Key lo, Key hi)                     // 返回 lo 到 hi 的元素个数
    194     {
    195         if (lo == null)
    196             throw new IllegalArgumentException("
    <size> lo == null.
    ");
    197         if (hi == null)
    198             throw new IllegalArgumentException("
    <size> hi == null.
    ");
    199         if (lo.compareTo(hi) > 0)
    200             return 0;
    201         return rank(hi) - rank(lo) + (contains(hi) ? 1 : 0);
    202 
    203     }
    204 
    205     public Iterable<Key> keys()
    206     {
    207         return keys(min(), max());
    208     }
    209 
    210     public Iterable<Key> keys(Key lo, Key hi)
    211     {
    212         if (lo == null)
    213             throw new IllegalArgumentException("
    <keys> lo == null.
    ");
    214         if (hi == null)
    215             throw new IllegalArgumentException("
    <keys> lo == null.
    ");
    216         Queue<Key> queue = new Queue<Key>();
    217         if (lo.compareTo(hi) > 0)
    218             return queue;
    219         for (int i = rank(lo); i < rank(hi); i++)
    220             queue.enqueue(keys[i]);
    221         if (contains(hi))
    222             queue.enqueue(keys[rank(hi)]);
    223         return queue;
    224     }
    225 
    226     private boolean check()
    227     {
    228         for (int i = 1; i < size(); i++)
    229         {
    230             if (keys[i].compareTo(keys[i - 1]) < 0)
    231                 return false;
    232         }
    233         for (int i = 0; i < size(); i++)
    234         {
    235             if (i != rank(select(i)))
    236                 return false;
    237         }
    238         for (int i = 0; i < size(); i++)
    239         {
    240             if (keys[i].compareTo(select(rank(keys[i]))) != 0)
    241                 return false;
    242         }
    243         return true;
    244     }
    245     public static void main(String[] args)
    246     {
    247         class01<String, Integer> st = new class01<String, Integer>();
    248         for (int i = 0; !StdIn.isEmpty(); i++)
    249         {
    250             String key = StdIn.readString();
    251             st.put(key, i);
    252         }
    253         for (String s : st.keys())
    254             StdOut.println(s + " " + st.get(s));
    255     }
    256 }
  • 相关阅读:
    document cookie用法
    禁用表单元素 && 禁止选中
    tool
    居中对齐
    插件
    浮动应用
    兼容低版本 ie 的思路
    Linux无权限上传文件解决办法
    linux系统常用运维命令
    linux系统快捷键
  • 原文地址:https://www.cnblogs.com/cuancuancuanhao/p/9779339.html
Copyright © 2011-2022 走看看