Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- namespace AiSD4
- {
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
- public Random rand = new Random();
- public int[] E, hashtable1, hashtable2;
- public int N = 499, kol, index, k;
- public int[] Exp(int kol)
- {
- double l = 2, F, x;
- int[] E = new int[N];
- int i = 0;
- while (i != kol)
- {
- F = rand.NextDouble();
- x = Math.Log(F) / (-l);
- x *= 1000;
- E[i] = (int)Math.Ceiling(x);
- i++;
- }
- E = E.Distinct().ToArray();
- Array.Resize<int>(ref E, N);
- for (int i1 = 0; i1 < kol; i1++)
- {
- listBox1.Items.Add(i1 + " " + E[i1]);
- }
- return E;
- }
- public int Hash1(int Key, int N) { return Key % N; }//деление
- public int Find1(int chislo, int[] mass)
- {
- int index = Hash1(chislo, mass.Length);
- int p = 0;
- while (mass[index] != chislo && p < N)
- {
- if (index != mass.Length - 1)
- index++;
- else index = 0;
- p++;
- }
- if (p == N)
- {
- return -1;
- }
- return index;
- }
- private void button1_Click(object sender, EventArgs e)
- {
- listBox1.Items.Clear();
- listBox2.Items.Clear();
- listBox3.Items.Clear();
- kol = Convert.ToInt32(textBox1.Text);
- E = Exp(kol);
- k = 0;
- hashtable1 = new int[N];//массив под деление
- for (int i = 0; i < kol; i++)
- {
- int p = 0;
- index = Hash1(E[i], N);
- while ((hashtable1[index] != 0))
- {
- index += 3 * p + 1 * p * p;
- if (index > N - 1)
- index -= (N - 1);
- k++;
- p++;
- }
- p = 0;
- hashtable1[index] = E[i];
- }
- listBox4.Items.Add("Д--" + kol + " " + k);
- chart1.Series[0].Points.AddXY(kol, k);
- k = 0;
- for (int i = 0; i < N; i++)
- {
- if (hashtable1[i] != 0) listBox2.Items.Add(i + " : " + hashtable1[i]);
- }
- hashtable2 = new int[N];//массив под умножение
- for (int i = 0; i < kol; i++)
- {
- index = Hash2(E[i], N);
- while ((hashtable2[index] != 0))
- {
- if (index != N - 1)
- index++;
- else index = 0;
- k++;
- }
- hashtable2[index] = E[i];
- }
- listBox4.Items.Add("У--" + kol + " " + k);
- chart1.Series[1].Points.AddXY(kol, k);
- for (int i = 0; i < N; i++)
- {
- if (hashtable2[i] != 0) listBox3.Items.Add(i + " : " + hashtable2[i]);
- }
- FindKollision();
- }
- public void FindKollision()
- {
- double l = 2, F, x;
- int r = 0;
- int p2 = 0;
- int p1 = 0;
- for(int k = 0; k < 50; k++)
- {
- F = rand.NextDouble();
- x = Math.Log(F) / (-l);
- x *= 1000;
- r = (int)Math.Ceiling(x);
- for (int i = 0; i < E.Length; i++)
- {
- if (E[i] == r)
- {
- break;
- }
- if (i == E.Length - 1)
- {
- i = 0;
- F = rand.NextDouble();
- x = Math.Log(F) / (-l);
- x *= 1000;
- r = (int)Math.Ceiling(x);
- }
- }
- int index = Hash2(r, E.Length);
- int curp2 = 0;
- while (E[index] != r && curp2 < N)
- {
- if (index != E.Length - 1)
- index++;
- else index = 0;
- p2++;
- curp2++;
- }
- int index1 = Hash1(r, E.Length);
- int curp1 = 0;
- while (E[index1] != r && curp1 < N)
- {
- if (index1 < E.Length - 1)
- index1++;
- else index1 = 0;
- p1++;
- curp1++;
- }
- }
- label8.Text = "Действий при делении: " + p1.ToString();
- label14.Text = "Действий при сложении: " + p2.ToString();
- }
- public int Find2(int chislo, int[] mass)
- {
- int index = Hash2(chislo, mass.Length);
- int p = 0;
- while (mass[index] != chislo && p < N)
- {
- if (index != mass.Length - 1)
- index++;
- else index = 0;
- p++;
- }
- if(p == N)
- {
- return -1;
- }
- return index;
- }
- private void button2_Click(object sender, EventArgs e)
- {
- int chislo = Convert.ToInt32(textBox2.Text);
- label6.Text = "Индекс в делении: " + Convert.ToString(Find1(chislo, hashtable1));
- label7.Text = "Индекс в умножении: " + Convert.ToString(Find2(chislo, hashtable2));
- }
- private void button3_Click(object sender, EventArgs e)
- {
- int chislo = Convert.ToInt32(textBox3.Text);
- E[kol] = chislo;
- kol++;
- index = Hash1(chislo, N);
- k = 0;
- while ((hashtable1[index] != 0))
- {
- if (index != N - 1)
- index++;
- else index = 0;
- k++;
- }
- label9.Text += Convert.ToString(index);
- label11.Text += Convert.ToString(k);
- hashtable1[index] = chislo;
- k = 0;
- index = Hash2(chislo, N);
- while ((hashtable2[index] != 0))
- {
- if (index != N - 1)
- index++;
- else index = 0;
- k++;
- }
- label10.Text += Convert.ToString(index);
- label12.Text += Convert.ToString(k);
- hashtable2[index] = chislo;
- //------------------------------------
- listBox1.Items.Clear();
- listBox2.Items.Clear();
- listBox3.Items.Clear();
- for (int i = 0; i < kol; i++)
- {
- listBox1.Items.Add(i + " : " + E[i]);
- }
- for (int i = 0; i < N; i++)
- {
- if (hashtable1[i] != 0) listBox2.Items.Add(i + " : " + hashtable1[i]);
- }
- for (int i = 0; i < N; i++)
- {
- if (hashtable2[i] != 0) listBox3.Items.Add(i + " : " + hashtable2[i]);
- }
- }
- public int Hash2(int Key, int N)//умножение
- {
- double A = 0.6180339887;
- return (int)Math.Floor(N * (Key * A - Math.Floor(Key * A)));
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement