码迷,mamicode.com
首页 > 其他好文 > 详细

11-散列4 Hashing - Hard Version (30 分)

时间:2019-06-06 12:30:44      阅读:511      评论:0      收藏:0      [点我收藏+]

标签:i++   numbers   UNC   ott   color   not   ini   hit   ica   

Given a hash table of size N, we can define a hash function (. Suppose that the linear probing is used to solve collisions, we can easily obtain the status of the hash table with a given sequence of input numbers.

However, now you are asked to solve the reversed problem: reconstruct the input sequence from the given status of the hash table. Whenever there are multiple choices, the smallest number is always taken.

Input Specification:

Each input file contains one test case. For each test case, the first line contains a positive integer N (≤), which is the size of the hash table. The next line contains N integers, separated by a space. A negative integer represents an empty cell in the hash table. It is guaranteed that all the non-negative integers are distinct in the table.

Output Specification:

For each test case, print a line that contains the input sequence, with the numbers separated by a space. Notice that there must be no extra space at the end of each line.

Sample Input:

11
33 1 13 12 34 38 27 22 32 -1 21

Sample Output:

1 13 12 21 33 34 38 27 22 32


发现元素的输入有先后关系,比如
1,13必须先12输出。
所以选用拓扑排序
技术图片
  1 #include <cstdio>
  2 #include <stdlib.h>
  3 #define MAXVERTEXNUM 1001
  4 #define INFINITY 65536
  5 #define ElementType DataAndPos
  6 #define MINDATA -100
  7 
  8 typedef int Vertex;
  9 typedef int Position;
 10 
 11 
 12 struct HashNode {
 13     Vertex i;
 14     int Data;
 15 };
 16 typedef struct HashNode * DataAndPos;
 17 
 18 struct GNode {
 19     int Nv;
 20     int G[MAXVERTEXNUM][MAXVERTEXNUM];
 21     int Data[MAXVERTEXNUM];
 22 };
 23 typedef struct GNode * MGraph;
 24 
 25 struct HNode {
 26     ElementType Data[MAXVERTEXNUM];
 27     int Size;
 28 };
 29 typedef struct HNode * MinHeap;
 30 
 31 
 32 //Function Area
 33 MGraph buildGraph();
 34 MGraph createGraph();
 35 
 36 int TopSort(MGraph G, Vertex TopOrder[]);
 37 MinHeap createMinHeap();
 38 void Insert(MinHeap H, Vertex W, MGraph Graph);
 39 Vertex DeleteMin(MinHeap H);
 40 
 41 void ShowArray(int A[], int N);
 42 
 43 
 44 
 45 int main()
 46 {
 47     int TopOrder[MAXVERTEXNUM];
 48     int RealNum;
 49     
 50     MGraph G = buildGraph();
 51     RealNum = TopSort(G,TopOrder);
 52     ShowArray(TopOrder, RealNum);
 53     
 54 }
 55 
 56 
 57 MGraph buildGraph()
 58 {
 59     MGraph Graph = createGraph();
 60     Vertex P;
 61     
 62     for (P=0; P<Graph->Nv; P++) {
 63         if (Graph->Data[P] > 0) {
 64             if (Graph->Data[P] % Graph->Nv != P) {
 65                 for (Vertex W = Graph->Data[P] % Graph->Nv; W!=P; W = (W + 1) % Graph->Nv) {
 66                     Graph->G[W][P] = 1;
 67                 }
 68             }
 69         }
 70         
 71     }
 72     
 73     
 74     return Graph;
 75     
 76     
 77     
 78     
 79     
 80 }
 81 MGraph createGraph()
 82 {
 83     MGraph Graph;
 84     Graph = (MGraph) malloc( sizeof(struct GNode) );
 85     
 86     scanf("%d", &Graph->Nv);
 87     
 88     for (int i=0; i<Graph->Nv; i++) {
 89         for (int j=0; j<Graph->Nv; j++) {
 90             Graph->G[i][j] = INFINITY;
 91         }
 92     }
 93     
 94     for (int i=0; i<Graph->Nv; i++) {
 95         scanf("%d", &(Graph->Data[i]) );
 96     }
 97     return Graph;
 98 }
 99 
100 int TopSort( MGraph Graph, Vertex TopOrder[] )
101 {
102     int Indegree[MAXVERTEXNUM];
103     int cnt;
104     cnt = 0;
105     
106     Vertex V, W;
107     MinHeap H = createMinHeap();
108     
109     
110     for (W = 0; W<Graph->Nv; W++) {
111         if (Graph->Data[W] > 0) {
112             Indegree[W] = 0;
113         }
114         else Indegree[W] = -1;
115         
116     }
117     for (V = 0; V<Graph->Nv; V++) {
118         for (W=0; W<Graph->Nv; W++) {
119             if (Graph->G[V][W] == 1) {
120                 Indegree[W]++;
121             }
122         }
123     }
124     for (V = 0; V<Graph->Nv; V++) {
125         if (Indegree[V] == 0) {
126             Insert(H, V, Graph);
127         }
128     }
129 
130  
131     cnt = 0;
132     while (H->Size != 0) {
133         V = DeleteMin(H);
134         TopOrder[cnt++] = Graph->Data[V];
135         
136         for (W=0; W<Graph->Nv; W++) {
137             if (Graph->G[V][W] == 1) {
138                 if (--Indegree[W] == 0) {
139                     Insert(H, W, Graph);
140                 }
141             }
142             
143         }
144         
145     }
146     
147     return cnt;
148     
149     
150     
151 }
152 MinHeap createMinHeap()
153 {
154     MinHeap H = new HNode;
155     H->Size = 0;
156     DataAndPos Sentry = new HashNode;
157     Sentry->Data = MINDATA;
158     H->Data[0] = Sentry;
159     
160     return H;
161 }
162 void Insert(MinHeap H, Vertex W, MGraph Graph)
163 {
164     DataAndPos NewNode = new HashNode;
165     NewNode->Data = Graph->Data[W];
166     NewNode->i = W;
167     
168     int i;
169 
170     for (i = ++H->Size; H->Data[i/2]->Data > NewNode->Data ; i/=2) {
171         H->Data[i] = H->Data[i/2];
172     }
173     H->Data[i] = NewNode;
174     
175 }
176 
177 Vertex DeleteMin(MinHeap H)
178 {
179     ElementType first;
180     ElementType last;
181     int Parent, Child;
182     
183     first = H->Data[1];
184     last = H->Data[H->Size--];
185     for (Parent = 1; Parent * 2 <= H->Size; Parent = Child ) {
186         Child = Parent * 2;
187         if (Child < H->Size and H->Data[Child]->Data > H->Data[Child+1]->Data ) {
188             Child++;
189         }
190         if (H->Data[Child]->Data > last->Data) {
191             break;
192         }
193         else H->Data[Parent] = H->Data[Child];
194     }
195     H->Data[Parent] = last;
196     
197     return first->i;
198 }
199 
200 void ShowArray(int A[], int N)
201 {
202     for (int i=0; i<N; i++) {
203         if(i!=0) printf(" ");
204         printf("%d", A[i]);
205     }
206     printf("\n");
207 }
View Code

 

 

11-散列4 Hashing - Hard Version (30 分)

标签:i++   numbers   UNC   ott   color   not   ini   hit   ica   

原文地址:https://www.cnblogs.com/acoccus/p/10935801.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!