算法3.1 顺序查找(基于无序链表)(algs4)

符号表是一种存储键值对的数据结构,支持两种操作:插入(put),即将一组新的键值对存入表中;查找(get),即根据给定的键得到相应的值。                                          

                                      算法3.1 顺序查找(基于无序链表)API

public class SequentialSearchST<Key,Value>

private Node first                                链表首节点

 

private class Node                        私有内部Node类                                                                           

Key key                                      保存键

Value val                                     保存值

Node next

public Node(Key key,Value val,Node next)

public Value get(Key key)                                   查找给定的键,返回相关联的值

public void put(Key key,Value val)                        查找给定的键,找到则更新其值,否则在表中新建结点                      

public int size()                                                  表中的键值对数量

public void delete (Key key)                                从表中删去键key及其对应的值

public boolean contains(Key key)                        键key在表中是否有对应的值

public Iterable<Key> Keys()                                表中所有键的集合

package _3_Searching;

import edu.princeton.cs.algs4.Queue;

/** 算法3.1 顺序查找(基于无序链表)
 * 符号表最主要的目的就是将一个键和一个值联系起来。
 * 符号表的实现使用了一个私有内部Node类来在链表中保存键和值。
 * get()的实现会顺序地搜索链表查找给定的键(找到则返回相关联的值)。
 * put()的实现也会顺序地搜索链表查找给定的键,如果找到则更新相关联的值,
 * 否则它会用给定的键值对创建一个新的结点并将其插到链表的开头。
*/
public class SequentialSearchST<Key,Value>
{
	private Node first;           //链表首节点
	private class Node
	{
		Key key;
		Value val;
		Node next;
		public Node(Key key,Value val,Node next)
		{
			this.key=key;
			this.val=val;
			this.next=next;
		}
	}
	public Value get(Key key)
	{                /*查找给定的键,返回相关联的值*/
		for(Node x=first;x!=null;x=x.next)
			if(key.equals(x.key))
				return x.val;                /*命中*/
		return null;                    /*未命中*/
	}
	public void put(Key key,Value val)
	{                  /*查找给定的键,找到则更新其值,否则在表中新建结点*/
		for(Node x=first;x!=null;x=x.next)
			if(key.equals(x.key))
			{
				x.val=val;
				return;                /*命中,更新*/
			}
		first=new Node(key,val,first);         /*未命中,新建结点*/
	}
	public int size()                         /*表中的键值对数量*/
	{
		int N=0;
		for(Node x=first;x!=null;x=x.next)
			N++;
		return N;
	}
	public void delete (Key key)              /*从表中删去键key及其对应的值*/
	{
		for(Node x=first;x!=null;x=x.next)
		{
			if(key.equals(x.next.key))
				x.next=x.next.next;
		}
	}
	public boolean contains(Key key)            /*键key在表中是否有对应的值*/
	{
		for(Node x=first;x!=null;x=x.next)          
			if(key.equals(x.key))               
				return true;
		return false;
	}
	public Iterable<Key> Keys()            /*表中所有键的集合*/
	{
		Queue<Key> q=new Queue<Key>();
		for(Node x=first;x!=null;x=x.next)
			q.enqueue(x.key);
		return q;
	}
}

                                         


package _3_Searching;

import java.util.Scanner;

/** 符号表的用例-计频器
 * 从输入中得到一列字符串并记录每个字符串的出现次数,然后遍历所有键并找出出现频率最高的键
*/
public class FrequencyCounter
{

	public static void main(String[] args)
	{
		int minLen=2;            /*最小键长*/
		Scanner sc=new Scanner(System.in);
		SequentialSearchST<String,Integer>  st=new SequentialSearchST<String,Integer> ();
		while(true)
		{
			String s=sc.nextLine();
			if(s.equals("eof"))
				break;
			if(s.length()<minLen) /*忽略较短的单词*/
				continue;
			if(!st.contains(s))
				st.put(s,1);
			else 
				st.put(s, st.get(s)+1);
		}
		String max=" ";
		st.put(max, 0);
		for(String i:st.Keys())
			if(st.get(i)>st.get(max))
				max=i;
		System.out.println(max+" "+st.get(max));
	}

}

                                                                                                        




                          





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值