Stanford Algorithms Design and Analysis Part 1 week 6

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

Problem Set-6




Programming Question-6

Question 1

Download the text file here. (Right click and save link as).

The goal of this problem is to implement a variant of the 2-SUM algorithm (covered in the Week 6 lecture on hash table applications).

The file contains 1 million integers, both positive and negative (there might be some repetitions!).This is your array of integers, with the  row of the file specifying the  entry of the array.

Your task is to compute the number of target values  in the interval [-10000,10000] (inclusive) such that there are distinct numbers  in the input file that satisfy . (NOTE: ensuring distinctness requires a one-line addition to the algorithm from lecture.)

Write your numeric answer (an integer between 0 and 20001) in the space provided.

OPTIONAL CHALLENGE: If this problem is too easy for you, try implementing your own hash table for it. For example, you could compare performance under the chaining and open addressing approaches to resolving collisions.


#include <iostream>#include <fstream>#define MIN 10000using namespace std;int hash2[MIN + 1] = { 0 };int count = 0;void readData() ifstream fin("2sum.txt")int temp = 0while(fin>>temp)  {  if(temp < MIN)    hash2[temp]++; }}bool hashMap(int n) if(n > MIN)   return falseif(hash2[n])   return trueelse   return false;}int main() { readData(); for(int i = -10000; i <= 10000; i++)  {  for(int j = -10000; j <= 10000; j++)   {   if(hashMap(j) && hashMap(i - j))    {    count++;    break;   }  } } cout<<count<<endlreturn 0;}

Question 2

Download the text file here.

The goal of this problem is to implement the "Median Maintenance" algorithm (covered in the Week 5 lecture on heap applications). The text file contains a list of the integers from 1 to 10000 in unsorted order; you should treat this as a stream of numbers, arriving one by one. Letting  denote the th number of the file, the th median  is defined as the median of the numbers . (So, if  is odd, then  is th smallest number among ; if  is even, then  is the th smallest number among .)

In the box below you should type the sum of these 10000 medians, modulo 10000 (i.e., only the last 4 digits). That is, you should compute .

OPTIONAL EXERCISE: Compare the performance achieved by heap-based and search-tree-based implementations of the algorithm.
#ifndef _HEAP_H_#define _HEAP_H_//        MAX_HEAPvoid MAX_HEAPIFY(short *A,short i)        {        short left=2*i,right=2*i+1,larger,tmp;        if ((left<=A[0])&&(A[left]>A[i]))          larger = left;        else          larger = i;        if ((right<=A[0])&&(A[right]>A[larger]))          larger = right;        if (larger != i)        {          tmp = A[larger]; A[larger] = A[i]; A[i] = tmp;          MAX_HEAPIFY(A,larger);        }}short EXTRACT_MAX(short *A)        short max = A[1];  A[1] = A[A[0]--];  MAX_HEAPIFY(A,1);  return max;}void HEAP_INCREASE_KEY(short *A,short i,short key)        short tmp;  A[i] = key;  while ((i>1)&&(A[i/2]<A[i]))        {        tmp = A[i]; A[i] = A[i/2]; A[i/2] = tmp;        i = i/2;  }}void MAX_HEAP_INSERT(short *A,short key)        {  A[0]++;  HEAP_INCREASE_KEY(A,A[0],key);}//        MIN_HEAPvoid MIN_HEAPIFY(short *A,short i)        {        short left=2*i,right=2*i+1,smaller,tmp;        if ((left<=A[0])&&(A[left]<A[i]))          smaller = left;        else          smaller = i;        if ((right<=A[0])&&(A[right]<A[smaller]))          smaller = right;        if (smaller != i)        {          tmp = A[smaller]; A[smaller] = A[i]; A[i] = tmp;          MIN_HEAPIFY(A,smaller);        }}short EXTRACT_MIN(short *A)        short min = A[1];  A[1] = A[A[0]--];  MIN_HEAPIFY(A,1);  return min;}void HEAP_DECREASE_KEY(short *A,short i,short key)        short tmp;  A[i] = key;  while ((i>1)&&(A[i/2]>A[i]))        {        tmp = A[i]; A[i] = A[i/2]; A[i/2] = tmp;        i = i/2;  }}void MIN_HEAP_INSERT(short *A,short key)        {  A[0]++;  HEAP_DECREASE_KEY(A,A[0],key);}#endif

#include<stdio.h>#include<stdlib.h>#include<ctype.h>#include "heap.h"const char INFILE[] = "Median.txt";#define MAX        10000short A1[10001],A2[10001];short RETURN_MEDIAN(short *A1,short *A2,short x)        if (x<A2[1])        MAX_HEAP_INSERT(A1,x);  else        MIN_HEAP_INSERT(A2,x);  if (A1[0]-A2[0]>1)                MIN_HEAP_INSERT(A2,EXTRACT_MAX(A1));  if (A2[0]>A1[0])                MAX_HEAP_INSERT(A1,EXTRACT_MIN(A2));  return A1[1];}void main()        int m=0;  A1[0] = 1; A1[1] = 0;  A2[0] = 1; A2[1] = 20000char line[10];  FILE *fp = fopen(INFILE,"r");  while (fgets(line,10,fp))                m = (m + RETURN_MEDIAN(A1,A2,atoi(line))) % 10000printf("%d\n",m);}


           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述

猜你喜欢

转载自blog.csdn.net/jffyuhgv/article/details/83888277