题目:http://www.patest.cn/contests/mooc-ds/09-%E6%95%A3%E5%88%973
题目的意思给你一个通过线性探测法生成Hash表,求出它的输入顺序并且要最小序列,散列函数x% N。
先看下图冲突 = (下标 - Key % N + N) % N
解:
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.Map.Entry;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author chenhong
* */
class Node implements Comparable<Node>
{
int value;
int index;
ArrayList<Node> from =null;//入度
ArrayList<Node> to = null ;//出度
public Node(int value,int index)
{
this.value=value;
this.index=index;
from = new ArrayList<Node>();
to = new ArrayList<Node>();
}
@Override
public int compareTo(Node o) {
// TODO Auto-generated method stub
return this.value-o.value;
}
}
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
ArrayList<Node> input = new ArrayList<Node>(); //输入序列
for(int i=0;i<N;i++)
{
int value= scanner.nextInt();
Node node = new Node(value,i);
input.add(node);
}
//初始化入度和出度
for(int i=0;i<N;i++)
{
Node node = input.get(i);
int value = node.value;
if(value<0) continue;
int key_N = value%N; // key%N
int to = (i-key_N+N)%N ;//冲突 = (下标 - Key % N + N) % N
for(int j=0; j<to ;j++)
{
int index = (key_N+j)%N;
Node n = input.get(index);
n.to.add(node);
node.from.add(n);
}
}
PriorityQueue<Node> output = new PriorityQueue<Node>();
//找到入度为0的点
for(int i=0;i<N;i++)
{
Node node = input.get(i);
if(node.from.size()==0)
output.add(node);
}
StringBuilder sb = new StringBuilder();
while(!output.isEmpty())
{
Node n = output.poll();
if(n.value<0) continue;
sb.append(n.value+" ");
int index = n.index;
ArrayList<Node> to = n.to;
ArrayList<Node> from = n.from;
//修改入度
for(Node i: to)
{
i.from.remove(n);
if(i.from.size()==0)
output.add(i);
}
}
if(sb.length()>0)
System.out.println(sb.substring(0, sb.length()-1));
}
}